/* ========================================================================== Description: When waiting joining the (I)BSS, beacon received from external ========================================================================== */ static VOID ApCliPeerProbeRspAtJoinAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { USHORT LenVIE; UCHAR *VarIE = NULL; NDIS_802_11_VARIABLE_IEs *pVIE = NULL; APCLI_CTRL_MSG_STRUCT ApCliCtrlMsg; PAPCLI_STRUCT pApCliEntry = NULL; #ifdef DOT11_N_SUPPORT UCHAR CentralChannel; #endif /* DOT11_N_SUPPORT */ USHORT ifIndex = (USHORT)(Elem->Priv); ULONG *pCurrState; BCN_IE_LIST *ie_list = NULL; if (ifIndex >= MAX_APCLI_NUM) return; /* Init Variable IE structure */ os_alloc_mem(NULL, (UCHAR **)&VarIE, MAX_VIE_LEN); if (VarIE == NULL) { MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("%s: Allocate memory fail!!!\n", __FUNCTION__)); goto LabelErr; } pVIE = (PNDIS_802_11_VARIABLE_IEs) VarIE; pVIE->Length = 0; os_alloc_mem(NULL, (UCHAR **)&ie_list, sizeof(BCN_IE_LIST)); if (ie_list == NULL) { MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("%s: Allocate ie_list fail!!!\n", __FUNCTION__)); goto LabelErr; } NdisZeroMemory(ie_list, sizeof(BCN_IE_LIST)); pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].SyncCurrState; if (PeerBeaconAndProbeRspSanity(pAd, Elem->Msg, Elem->MsgLen, Elem->Channel, ie_list, &LenVIE, pVIE, TRUE)) { /* BEACON from desired BSS/IBSS found. We should be able to decide most BSS parameters here. Q. But what happen if this JOIN doesn't conclude a successful ASSOCIATEION? Do we need to receover back all parameters belonging to previous BSS? A. Should be not. There's no back-door recover to previous AP. It still need a new JOIN-AUTH-ASSOC sequence. */ INT ssidEqualFlag = FALSE; #ifdef WSC_AP_SUPPORT INT ssidEmptyFlag = FALSE; #endif /* WSC_AP_SUPPORT */ INT bssidEqualFlag = FALSE; INT bssidEmptyFlag = FALSE; INT matchFlag = FALSE; ULONG Bssidx; /* Update ScanTab */ Bssidx = BssTableSearch(&pAd->ScanTab, ie_list->Bssid, ie_list->Channel); if (Bssidx == BSS_NOT_FOUND) { /* discover new AP of this network, create BSS entry */ Bssidx = BssTableSetEntry(pAd, &pAd->ScanTab, ie_list, -127, LenVIE, pVIE); if (Bssidx == BSS_NOT_FOUND) /* return if BSS table full */ { DBGPRINT(RT_DEBUG_ERROR, ("ERROR: Driver ScanTable Full In Apcli ProbeRsp Join\n")); goto LabelErr; } NdisMoveMemory(pAd->ScanTab.BssEntry[Bssidx].PTSF, &Elem->Msg[24], 4); NdisMoveMemory(&pAd->ScanTab.BssEntry[Bssidx].TTSF[0], &Elem->TimeStamp.u.LowPart, 4); NdisMoveMemory(&pAd->ScanTab.BssEntry[Bssidx].TTSF[4], &Elem->TimeStamp.u.LowPart, 4); pAd->ScanTab.BssEntry[Bssidx].MinSNR = Elem->Signal % 10; if (pAd->ScanTab.BssEntry[Bssidx].MinSNR == 0) pAd->ScanTab.BssEntry[Bssidx].MinSNR = -5; NdisMoveMemory(pAd->ScanTab.BssEntry[Bssidx].MacAddr, ie_list->Addr2, MAC_ADDR_LEN); } #if defined(RT_CFG80211_P2P_CONCURRENT_DEVICE) || defined(CFG80211_MULTI_STA) CHAR Rssi0 = ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_0); CHAR Rssi1 = ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_1); CHAR Rssi2 = ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_2); LONG RealRssi = (LONG)(RTMPMaxRssi(pAd, Rssi0, Rssi1, Rssi2)); DBGPRINT(RT_DEBUG_TRACE, ("Info: Update the SSID %s in Kernel Table\n", ie_list->Ssid)); RT_CFG80211_SCANNING_INFORM(pAd, Bssidx, ie_list->Channel, (UCHAR *)Elem->Msg, Elem->MsgLen, RealRssi); #endif /* RT_CFG80211_P2P_CONCURRENT_DEVICE || CFG80211_MULTI_STA */ pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; if (!MAC_ADDR_EQUAL(pApCliEntry->CfgApCliBssid, ZERO_MAC_ADDR)) { if (!MAC_ADDR_EQUAL(pApCliEntry->CfgApCliBssid, ie_list->Bssid)) { DBGPRINT(RT_DEBUG_ERROR, ("ERROR: AP BSSID not equal\n")); goto LabelErr; } } /* Check the Probe-Rsp's Bssid. */ if(!MAC_ADDR_EQUAL(pApCliEntry->CfgApCliBssid, ZERO_MAC_ADDR)) bssidEqualFlag = MAC_ADDR_EQUAL(pApCliEntry->CfgApCliBssid, ie_list->Bssid); else bssidEmptyFlag = TRUE; /* Check the Probe-Rsp's Ssid. */ if(pApCliEntry->CfgSsidLen != 0) ssidEqualFlag = SSID_EQUAL(pApCliEntry->CfgSsid, pApCliEntry->CfgSsidLen, ie_list->Ssid, ie_list->SsidLen); #ifdef WSC_AP_SUPPORT else ssidEmptyFlag = TRUE; if ((pAd->ApCfg.ApCliTab[ifIndex].WscControl.WscConfMode != WSC_DISABLE) && (pAd->ApCfg.ApCliTab[ifIndex].WscControl.bWscTrigger == TRUE)) { /* bssid and ssid, Both match. */ if (bssidEqualFlag && ssidEqualFlag) matchFlag = TRUE; /* ssid match but bssid doesn't be indicate. */ else if(ssidEqualFlag && bssidEmptyFlag) matchFlag = TRUE; /* user doesn't indicate any bssid or ssid. AP-Clinet will auto pick a AP to join by most strong siganl strength. */ else if (bssidEmptyFlag && ssidEmptyFlag) matchFlag = TRUE; } else #endif /* WSC_AP_SUPPORT */ { if(!bssidEmptyFlag) { if (bssidEqualFlag && ssidEqualFlag) matchFlag = TRUE; else matchFlag = FALSE; } else if (ssidEqualFlag) matchFlag = TRUE; else matchFlag = FALSE; } MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("SYNC - bssidEqualFlag=%d, ssidEqualFlag=%d, matchFlag=%d\n", bssidEqualFlag, ssidEqualFlag, matchFlag)); if (matchFlag) { /* Validate RSN IE if necessary, then copy store this information */ if ((LenVIE > 0) #ifdef WSC_AP_SUPPORT && ((pApCliEntry->WscControl.WscConfMode == WSC_DISABLE) || (pApCliEntry->WscControl.bWscTrigger == FALSE)) #endif /* WSC_AP_SUPPORT */ #if defined(RT_CFG80211_P2P_CONCURRENT_DEVICE) || defined(CFG80211_MULTI_STA) /* When using CFG80211 and trigger WPS, do not check security. */ && ! (pApCliEntry->wpa_supplicant_info.WpaSupplicantUP & WPA_SUPPLICANT_ENABLE_WPS) #endif /* RT_CFG80211_P2P_CONCURRENT_DEVICE || CFG80211_MULTI_STA */ ) { if (ApCliValidateRSNIE(pAd, (PEID_STRUCT)pVIE, LenVIE, ifIndex)) { pApCliEntry->MlmeAux.VarIELen = LenVIE; NdisMoveMemory(pApCliEntry->MlmeAux.VarIEs, pVIE, pApCliEntry->MlmeAux.VarIELen); } else { /* ignore this response */ pApCliEntry->MlmeAux.VarIELen = 0; MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("ERROR: The RSN IE of this received Probe-resp is dis-match !!!!!!!!!! \n")); goto LabelErr; } } else { if (pApCliEntry->wdev.AuthMode >= Ndis802_11AuthModeWPA #ifdef WSC_AP_SUPPORT && ((pApCliEntry->WscControl.WscConfMode == WSC_DISABLE) || (pApCliEntry->WscControl.bWscTrigger == FALSE)) #endif /* WSC_AP_SUPPORT */ ) { /* ignore this response */ MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("ERROR: The received Probe-resp has empty RSN IE !!!!!!!!!! \n")); goto LabelErr; } pApCliEntry->MlmeAux.VarIELen = 0; } MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("SYNC - receive desired PROBE_RSP at JoinWaitProbeRsp... Channel = %d\n", ie_list->Channel)); /* if the Bssid doesn't be indicated then you need to decide which AP to connect by most strong Rssi signal strength. */ if (bssidEqualFlag == FALSE) { /* caculate real rssi value. */ CHAR Rssi0 = ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_0); CHAR Rssi1 = ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_1); CHAR Rssi2 = ConvertToRssi(pAd, &Elem->rssi_info, RSSI_IDX_2); LONG RealRssi = (LONG)(RTMPMaxRssi(pAd, Rssi0, Rssi1, Rssi2)); MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("SYNC - previous Rssi = %ld current Rssi=%ld\n", pApCliEntry->MlmeAux.Rssi, (LONG)RealRssi)); if (pApCliEntry->MlmeAux.Rssi > (LONG)RealRssi) goto LabelErr; else pApCliEntry->MlmeAux.Rssi = RealRssi; } else { BOOLEAN Cancelled; RTMPCancelTimer(&pApCliEntry->MlmeAux.ProbeTimer, &Cancelled); } NdisMoveMemory(pApCliEntry->MlmeAux.Ssid, ie_list->Ssid, ie_list->SsidLen); pApCliEntry->MlmeAux.SsidLen = ie_list->SsidLen; NdisMoveMemory(pApCliEntry->MlmeAux.Bssid, ie_list->Bssid, MAC_ADDR_LEN); pApCliEntry->MlmeAux.CapabilityInfo = ie_list->CapabilityInfo & SUPPORTED_CAPABILITY_INFO; pApCliEntry->MlmeAux.BssType = ie_list->BssType; pApCliEntry->MlmeAux.BeaconPeriod = ie_list->BeaconPeriod; pApCliEntry->MlmeAux.Channel = ie_list->Channel; pApCliEntry->MlmeAux.AtimWin = ie_list->AtimWin; pApCliEntry->MlmeAux.CfpPeriod = ie_list->CfParm.CfpPeriod; pApCliEntry->MlmeAux.CfpMaxDuration = ie_list->CfParm.CfpMaxDuration; pApCliEntry->MlmeAux.APRalinkIe = ie_list->RalinkIe; /* Copy AP's supported rate to MlmeAux for creating assoication request */ /* Also filter out not supported rate */ pApCliEntry->MlmeAux.SupRateLen = ie_list->SupRateLen; NdisMoveMemory(pApCliEntry->MlmeAux.SupRate, ie_list->SupRate, ie_list->SupRateLen); RTMPCheckRates(pAd, pApCliEntry->MlmeAux.SupRate, &pApCliEntry->MlmeAux.SupRateLen); pApCliEntry->MlmeAux.ExtRateLen = ie_list->ExtRateLen; NdisMoveMemory(pApCliEntry->MlmeAux.ExtRate, ie_list->ExtRate, ie_list->ExtRateLen); RTMPCheckRates(pAd, pApCliEntry->MlmeAux.ExtRate, &pApCliEntry->MlmeAux.ExtRateLen); #ifdef APCLI_CERT_SUPPORT /* Get the ext capability info element */ if (pAd->bApCliCertTest == TRUE) { NdisMoveMemory(&pApCliEntry->MlmeAux.ExtCapInfo, &ie_list->ExtCapInfo,sizeof(ie_list->ExtCapInfo)); #ifdef DOT11_N_SUPPORT #ifdef DOT11N_DRAFT3 MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("\x1b[31m ApCliMlmeAux.ExtCapInfo=%d \x1b[m\n", pApCliEntry->MlmeAux.ExtCapInfo.BssCoexistMgmtSupport)); //zero debug 210121122 if (pAd->CommonCfg.bBssCoexEnable == TRUE) pAd->CommonCfg.ExtCapIE.BssCoexistMgmtSupport = 1; #endif /* DOT11N_DRAFT3 */ #endif /* DOT11_N_SUPPORT */ } #endif /* APCLI_CERT_SUPPORT */ #ifdef DOT11_N_SUPPORT NdisZeroMemory(pApCliEntry->RxMcsSet,sizeof(pApCliEntry->RxMcsSet)); /* filter out un-supported ht rates */ if ((ie_list->HtCapabilityLen > 0) && (pApCliEntry->wdev.DesiredHtPhyInfo.bHtEnable) && WMODE_CAP_N(pAd->CommonCfg.PhyMode)) { RTMPZeroMemory(&pApCliEntry->MlmeAux.HtCapability, SIZE_HT_CAP_IE); pApCliEntry->MlmeAux.NewExtChannelOffset = ie_list->NewExtChannelOffset; pApCliEntry->MlmeAux.HtCapabilityLen = ie_list->HtCapabilityLen; ApCliCheckHt(pAd, ifIndex, &ie_list->HtCapability, &ie_list->AddHtInfo); if (ie_list->AddHtInfoLen > 0) { CentralChannel = ie_list->AddHtInfo.ControlChan; /* Check again the Bandwidth capability of this AP. */ CentralChannel = get_cent_ch_by_htinfo(pAd, &ie_list->AddHtInfo, &ie_list->HtCapability); MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("PeerBeaconAtJoinAction HT===>CentralCh = %d, ControlCh = %d\n", CentralChannel, ie_list->AddHtInfo.ControlChan)); } } else #endif /* DOT11_N_SUPPORT */ { RTMPZeroMemory(&pApCliEntry->MlmeAux.HtCapability, SIZE_HT_CAP_IE); RTMPZeroMemory(&pApCliEntry->MlmeAux.AddHtInfo, SIZE_ADD_HT_INFO_IE); pApCliEntry->MlmeAux.HtCapabilityLen = 0; } ApCliUpdateMlmeRate(pAd, ifIndex); #ifdef DOT11_N_SUPPORT /* copy QOS related information */ if (WMODE_CAP_N(pAd->CommonCfg.PhyMode)) { NdisMoveMemory(&pApCliEntry->MlmeAux.APEdcaParm, &ie_list->EdcaParm, sizeof(EDCA_PARM)); NdisMoveMemory(&pApCliEntry->MlmeAux.APQbssLoad, &ie_list->QbssLoad, sizeof(QBSS_LOAD_PARM)); NdisMoveMemory(&pApCliEntry->MlmeAux.APQosCapability, &ie_list->QosCapability, sizeof(QOS_CAPABILITY_PARM)); } else #endif /* DOT11_N_SUPPORT */ { NdisZeroMemory(&pApCliEntry->MlmeAux.APEdcaParm, sizeof(EDCA_PARM)); NdisZeroMemory(&pApCliEntry->MlmeAux.APQbssLoad, sizeof(QBSS_LOAD_PARM)); NdisZeroMemory(&pApCliEntry->MlmeAux.APQosCapability, sizeof(QOS_CAPABILITY_PARM)); } MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("APCLI SYNC - after JOIN, SupRateLen=%d, ExtRateLen=%d\n", pApCliEntry->MlmeAux.SupRateLen, pApCliEntry->MlmeAux.ExtRateLen)); if (ie_list->AironetCellPowerLimit != 0xFF) { /* We need to change our TxPower for CCX 2.0 AP Control of Client Transmit Power */ ChangeToCellPowerLimit(pAd, ie_list->AironetCellPowerLimit); } else /* Used the default TX Power Percentage. */ pAd->CommonCfg.TxPowerPercentage = pAd->CommonCfg.TxPowerDefault; #ifdef WSC_AP_SUPPORT #ifdef DOT11_N_SUPPORT if ((pApCliEntry->WscControl.WscConfMode != WSC_DISABLE) && (pApCliEntry->WscControl.bWscTrigger == TRUE)) { ADD_HTINFO RootApHtInfo, ApHtInfo; ApHtInfo = pAd->CommonCfg.AddHTInfo.AddHtInfo; RootApHtInfo = ie_list->AddHtInfo.AddHtInfo; if ((pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth == BW_40) && (RootApHtInfo.RecomWidth) && (RootApHtInfo.ExtChanOffset != ApHtInfo.ExtChanOffset)) { if (RootApHtInfo.ExtChanOffset == EXTCHA_ABOVE) Set_HtExtcha_Proc(pAd, "1"); else Set_HtExtcha_Proc(pAd, "0"); goto LabelErr; } } #endif /* DOT11_N_SUPPORT */ #endif /* WSC_AP_SUPPORT */ if(bssidEqualFlag == TRUE) { *pCurrState = APCLI_SYNC_IDLE; ApCliCtrlMsg.Status = MLME_SUCCESS; #ifdef MAC_REPEATER_SUPPORT ApCliCtrlMsg.BssIdx = ifIndex; ApCliCtrlMsg.CliIdx = 0xFF; #endif /* MAC_REPEATER_SUPPORT */ MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_PROBE_RSP, sizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex); } } } LabelErr: if (VarIE != NULL) os_free_mem(NULL, VarIE); if (ie_list != NULL) os_free_mem(NULL, ie_list); return; }
/* ======================================================================== Routine Description: MD5 computation for one block (512 bits) Arguments: pMD5_CTX Pointer to Md5_CTX_STRUC Return Value: None Note: T[i] := floor(abs(sin(i + 1)) * (2 pow 32)), i is number of round ======================================================================== */ VOID RT_MD5_Hash ( IN MD5_CTX_STRUC *pMD5_CTX) { UINT32 X_i; UINT32 X[16]; UINT32 a,b,c,d; /* Prepare the message schedule, {X_i} */ NdisMoveMemory(X, pMD5_CTX->Block, MD5_BLOCK_SIZE); for (X_i = 0; X_i < 16; X_i++) X[X_i] = cpu2le32(X[X_i]); /* Endian Swap */ /* End of for */ /* MD5 hash computation */ /* Initialize the working variables */ a = pMD5_CTX->HashValue[0]; b = pMD5_CTX->HashValue[1]; c = pMD5_CTX->HashValue[2]; d = pMD5_CTX->HashValue[3]; /* * Round 1 * Let [abcd k s i] denote the operation * a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s) */ ROUND1(a, b, c, d, X[ 0], 7, 0xd76aa478); /* 1 */ ROUND1(d, a, b, c, X[ 1], 12, 0xe8c7b756); /* 2 */ ROUND1(c, d, a, b, X[ 2], 17, 0x242070db); /* 3 */ ROUND1(b, c, d, a, X[ 3], 22, 0xc1bdceee); /* 4 */ ROUND1(a, b, c, d, X[ 4], 7, 0xf57c0faf); /* 5 */ ROUND1(d, a, b, c, X[ 5], 12, 0x4787c62a); /* 6 */ ROUND1(c, d, a, b, X[ 6], 17, 0xa8304613); /* 7 */ ROUND1(b, c, d, a, X[ 7], 22, 0xfd469501); /* 8 */ ROUND1(a, b, c, d, X[ 8], 7, 0x698098d8); /* 9 */ ROUND1(d, a, b, c, X[ 9], 12, 0x8b44f7af); /* 10 */ ROUND1(c, d, a, b, X[10], 17, 0xffff5bb1); /* 11 */ ROUND1(b, c, d, a, X[11], 22, 0x895cd7be); /* 12 */ ROUND1(a, b, c, d, X[12], 7, 0x6b901122); /* 13 */ ROUND1(d, a, b, c, X[13], 12, 0xfd987193); /* 14 */ ROUND1(c, d, a, b, X[14], 17, 0xa679438e); /* 15 */ ROUND1(b, c, d, a, X[15], 22, 0x49b40821); /* 16 */ /* * Round 2 * Let [abcd k s i] denote the operation * a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s) */ ROUND2(a, b, c, d, X[ 1], 5, 0xf61e2562); /* 17 */ ROUND2(d, a, b, c, X[ 6], 9, 0xc040b340); /* 18 */ ROUND2(c, d, a, b, X[11], 14, 0x265e5a51); /* 19 */ ROUND2(b, c, d, a, X[ 0], 20, 0xe9b6c7aa); /* 20 */ ROUND2(a, b, c, d, X[ 5], 5, 0xd62f105d); /* 21 */ ROUND2(d, a, b, c, X[10], 9, 0x2441453); /* 22 */ ROUND2(c, d, a, b, X[15], 14, 0xd8a1e681); /* 23 */ ROUND2(b, c, d, a, X[ 4], 20, 0xe7d3fbc8); /* 24 */ ROUND2(a, b, c, d, X[ 9], 5, 0x21e1cde6); /* 25 */ ROUND2(d, a, b, c, X[14], 9, 0xc33707d6); /* 26 */ ROUND2(c, d, a, b, X[ 3], 14, 0xf4d50d87); /* 27 */ ROUND2(b, c, d, a, X[ 8], 20, 0x455a14ed); /* 28 */ ROUND2(a, b, c, d, X[13], 5, 0xa9e3e905); /* 29 */ ROUND2(d, a, b, c, X[ 2], 9, 0xfcefa3f8); /* 30 */ ROUND2(c, d, a, b, X[ 7], 14, 0x676f02d9); /* 31 */ ROUND2(b, c, d, a, X[12], 20, 0x8d2a4c8a); /* 32 */ /* * Round 3 * Let [abcd k s t] denote the operation * a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s) */ ROUND3(a, b, c, d, X[ 5], 4, 0xfffa3942); /* 33 */ ROUND3(d, a, b, c, X[ 8], 11, 0x8771f681); /* 34 */ ROUND3(c, d, a, b, X[11], 16, 0x6d9d6122); /* 35 */ ROUND3(b, c, d, a, X[14], 23, 0xfde5380c); /* 36 */ ROUND3(a, b, c, d, X[ 1], 4, 0xa4beea44); /* 37 */ ROUND3(d, a, b, c, X[ 4], 11, 0x4bdecfa9); /* 38 */ ROUND3(c, d, a, b, X[ 7], 16, 0xf6bb4b60); /* 39 */ ROUND3(b, c, d, a, X[10], 23, 0xbebfbc70); /* 40 */ ROUND3(a, b, c, d, X[13], 4, 0x289b7ec6); /* 41 */ ROUND3(d, a, b, c, X[ 0], 11, 0xeaa127fa); /* 42 */ ROUND3(c, d, a, b, X[ 3], 16, 0xd4ef3085); /* 43 */ ROUND3(b, c, d, a, X[ 6], 23, 0x4881d05); /* 44 */ ROUND3(a, b, c, d, X[ 9], 4, 0xd9d4d039); /* 45 */ ROUND3(d, a, b, c, X[12], 11, 0xe6db99e5); /* 46 */ ROUND3(c, d, a, b, X[15], 16, 0x1fa27cf8); /* 47 */ ROUND3(b, c, d, a, X[ 2], 23, 0xc4ac5665); /* 48 */ /* * Round 4 * Let [abcd k s t] denote the operation * a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s) */ ROUND4(a, b, c, d, X[ 0], 6, 0xf4292244); /* 49 */ ROUND4(d, a, b, c, X[ 7], 10, 0x432aff97); /* 50 */ ROUND4(c, d, a, b, X[14], 15, 0xab9423a7); /* 51 */ ROUND4(b, c, d, a, X[ 5], 21, 0xfc93a039); /* 52 */ ROUND4(a, b, c, d, X[12], 6, 0x655b59c3); /* 53 */ ROUND4(d, a, b, c, X[ 3], 10, 0x8f0ccc92); /* 54 */ ROUND4(c, d, a, b, X[10], 15, 0xffeff47d); /* 55 */ ROUND4(b, c, d, a, X[ 1], 21, 0x85845dd1); /* 56 */ ROUND4(a, b, c, d, X[ 8], 6, 0x6fa87e4f); /* 57 */ ROUND4(d, a, b, c, X[15], 10, 0xfe2ce6e0); /* 58 */ ROUND4(c, d, a, b, X[ 6], 15, 0xa3014314); /* 59 */ ROUND4(b, c, d, a, X[13], 21, 0x4e0811a1); /* 60 */ ROUND4(a, b, c, d, X[ 4], 6, 0xf7537e82); /* 61 */ ROUND4(d, a, b, c, X[11], 10, 0xbd3af235); /* 62 */ ROUND4(c, d, a, b, X[ 2], 15, 0x2ad7d2bb); /* 63 */ ROUND4(b, c, d, a, X[ 9], 21, 0xeb86d391); /* 64 */ /* Compute the i^th intermediate hash value H^(i) */ pMD5_CTX->HashValue[0] += a; pMD5_CTX->HashValue[1] += b; pMD5_CTX->HashValue[2] += c; pMD5_CTX->HashValue[3] += d; NdisZeroMemory(pMD5_CTX->Block, MD5_BLOCK_SIZE); pMD5_CTX->BlockLen = 0; } /* End of RT_MD5_Hash */
/* ======================================================================== Routine Description: Apply new regulatory rule. Arguments: pAdCB - WLAN control block pointer pWiphy - Wireless hardware description pAlpha2 - Regulation domain (2B) Return Value: NONE Note: Can only be called when interface is up. For general mac80211 device, it will be set to new power by Ops->config() In rt2x00/, the settings is done in rt2x00lib_config(). ======================================================================== */ VOID CFG80211_RegRuleApply( IN VOID *pAdCB, IN VOID *pWiphy, IN UCHAR *pAlpha2) { PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdCB; VOID *pBand24G, *pBand5G; UINT32 IdBand, IdChan, IdPwr; UINT32 ChanNum, ChanId, Power, RecId, DfsType; BOOLEAN FlgIsRadar; ULONG IrqFlags; #ifdef DFS_SUPPORT RADAR_DETECT_STRUCT *pRadarDetect; #endif /* DFS_SUPPORT */ CFG80211DBG(RT_DEBUG_ERROR, ("crda> CFG80211_RegRuleApply ==>\n")); /* init */ pBand24G = NULL; pBand5G = NULL; if (pAd == NULL) return; RTMP_IRQ_LOCK(&pAd->irq_lock, IrqFlags); /* zero first */ NdisZeroMemory(pAd->ChannelList, MAX_NUM_OF_CHANNELS * sizeof(CHANNEL_TX_POWER)); /* 2.4GHZ & 5GHz */ RecId = 0; #ifdef DFS_SUPPORT pRadarDetect = &pAd->CommonCfg.RadarDetect; #endif /* DFS_SUPPORT */ /* find the DfsType */ DfsType = CE; pBand24G = NULL; pBand5G = NULL; if (CFG80211OS_BandInfoGet(CFG80211CB, pWiphy, &pBand24G, &pBand5G) == FALSE) return; #ifdef AUTO_CH_SELECT_ENHANCE #ifdef EXT_BUILD_CHANNEL_LIST if ((pAlpha2[0] != '0') && (pAlpha2[1] != '0')) { UINT32 IdReg; if (pBand5G != NULL) { for(IdReg=0; ; IdReg++) { if (ChRegion[IdReg].CountReg[0] == 0x00) break; /* End of if */ if ((pAlpha2[0] == ChRegion[IdReg].CountReg[0]) && (pAlpha2[1] == ChRegion[IdReg].CountReg[1])) { DfsType = ChRegion[IdReg].DfsType; CFG80211DBG(RT_DEBUG_ERROR, ("crda> find region %c%c, DFS Type %d\n", pAlpha2[0], pAlpha2[1], DfsType)); break; } /* End of if */ } /* End of for */ } /* End of if */ } /* End of if */ #endif /* EXT_BUILD_CHANNEL_LIST */ #endif /* AUTO_CH_SELECT_ENHANCE */ for(IdBand=0; IdBand<2; IdBand++) { if (((IdBand == 0) && (pBand24G == NULL)) || ((IdBand == 1) && (pBand5G == NULL))) { continue; } /* End of if */ if (IdBand == 0) { CFG80211DBG(RT_DEBUG_ERROR, ("crda> reset chan/power for 2.4GHz\n")); } else { CFG80211DBG(RT_DEBUG_ERROR, ("crda> reset chan/power for 5GHz\n")); } /* End of if */ ChanNum = CFG80211OS_ChanNumGet(CFG80211CB, pWiphy, IdBand); for(IdChan=0; IdChan<ChanNum; IdChan++) { if (CFG80211OS_ChanInfoGet(CFG80211CB, pWiphy, IdBand, IdChan, &ChanId, &Power, &FlgIsRadar) == FALSE) { /* the channel is not allowed in the regulatory domain */ /* get next channel information */ continue; } /* End of if */ if ((pAd->CommonCfg.PhyMode == PHY_11A) || (pAd->CommonCfg.PhyMode == PHY_11AN_MIXED)) { /* 5G-only mode */ if (ChanId <= CFG80211_NUM_OF_CHAN_2GHZ) continue; /* check next */ /* End of if */ } /* End of if */ if ((pAd->CommonCfg.PhyMode != PHY_11A) && (pAd->CommonCfg.PhyMode != PHY_11ABG_MIXED) && (pAd->CommonCfg.PhyMode != PHY_11AN_MIXED) && (pAd->CommonCfg.PhyMode != PHY_11ABGN_MIXED) && (pAd->CommonCfg.PhyMode != PHY_11AGN_MIXED)) { /* 2.5G-only mode */ if (ChanId > CFG80211_NUM_OF_CHAN_2GHZ) continue; /* check next */ /* End of if */ } /* End of if */ for(IdPwr=0; IdPwr<MAX_NUM_OF_CHANNELS; IdPwr++) { if (ChanId == pAd->TxPower[IdPwr].Channel) { /* init the channel info. */ NdisMoveMemory(&pAd->ChannelList[RecId], &pAd->TxPower[IdPwr], sizeof(CHANNEL_TX_POWER)); /* keep channel number */ pAd->ChannelList[RecId].Channel = ChanId; /* keep maximum tranmission power */ pAd->ChannelList[RecId].MaxTxPwr = Power; /* keep DFS flag */ if (FlgIsRadar == TRUE) pAd->ChannelList[RecId].DfsReq = TRUE; else pAd->ChannelList[RecId].DfsReq = FALSE; /* End of if */ /* keep DFS type */ pAd->ChannelList[RecId].RegulatoryDomain = DfsType; /* re-set DFS info. */ pAd->CommonCfg.RDDurRegion = DfsType; CFG80211DBG(RT_DEBUG_ERROR, ("Chan %03d:\tpower %d dBm, " "DFS %d, DFS Type %d\n", ChanId, Power, ((FlgIsRadar == TRUE)?1:0), DfsType)); /* change to record next channel info. */ RecId ++; break; } /* End of if */ } /* End of for */ } /* End of for */ } /* End of for */ pAd->ChannelListNum = RecId; RTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags); CFG80211DBG(RT_DEBUG_ERROR, ("crda> Number of channels = %d\n", RecId)); } /* End of CFG80211_RegRuleApply */
static void *usb_rtusb_probe(struct usb_device *dev, UINT interface, const struct usb_device_id *id_table) { PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)NULL; int i; struct net_device *netdev; int res = -ENOMEM; DBGPRINT(RT_DEBUG_TRACE, "%s-->\n", __FUNCTION__); for (i = 0; i < rtusb_usb_id_len; i++) { if (dev->descriptor.idVendor == rtusb_usb_id[i].idVendor && dev->descriptor.idProduct == rtusb_usb_id[i].idProduct) { printk("idVendor = 0x%x, idProduct = 0x%x \n",dev->descriptor.idVendor, dev->descriptor.idProduct); break; } } if (i == rtusb_usb_id_len) { printk("Device Descriptor not matching\n"); return NULL; } netdev = alloc_etherdev(sizeof(PRTMP_ADAPTER)); if(!netdev) { printk("alloc_etherdev failed\n"); MOD_DEC_USE_COUNT; usb_dec_dev_use(dev); return NULL; } netdev->priv = (PVOID)vmalloc(sizeof(RTMP_ADAPTER)); pAd = netdev->priv; if(pAd == NULL) { kfree(pAd->net_dev); printk("vmalloc failed\n"); return NULL; } NdisZeroMemory(pAd, sizeof(RTMP_ADAPTER)); pAd->net_dev = netdev; netif_stop_queue(netdev); pAd->config = dev->config; pAd->pUsb_Dev= dev; SET_MODULE_OWNER(pAd->net_dev); ether_setup(pAd->net_dev); netdev->priv_flags = INT_MAIN; netdev->open = usb_rtusb_open; netdev->hard_start_xmit = usb_rtusb_sendpkt; netdev->stop = usb_rtusb_close; netdev->priv = pAd; netdev->get_stats = rt73_get_ether_stats; #if (WIRELESS_EXT >= 12) #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) netdev->get_wireless_stats = rt73_get_wireless_stats; #endif netdev->wireless_handlers = (struct iw_handler_def *) &rt73_iw_handler_def; #endif netdev->do_ioctl = rt73_ioctl; pAd->net_dev->hard_header_len = 14; pAd->net_dev->mtu = 1500; pAd->net_dev->addr_len = 6; pAd->net_dev->weight = 64; OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED); {// find available int i=0; char slot_name[IFNAMSIZ]; struct net_device *device; struct usb_interface *ifp= &dev->actconfig->interface[interface]; // get interface from system struct usb_interface_descriptor *as; struct usb_endpoint_descriptor *ep; for (i = 0; i < 8; i++) { sprintf(slot_name, "rausb%d", i); read_lock_bh(&dev_base_lock); // avoid multiple init //Benson modify --> for (device = dev_base; device != NULL; device = device->next) //<-- Benson modify { if (strncmp(device->name, slot_name, 4) == 0) { break; } } read_unlock_bh(&dev_base_lock); if(device == NULL) break; } if(i == 8) { DBGPRINT(RT_DEBUG_ERROR, "No available slot name\n"); return NULL; } sprintf(pAd->net_dev->name, "rausb%d", i); DBGPRINT(RT_DEBUG_ERROR, "usb device name %s\n",pAd->net_dev->name); /* get Max Packet Size from usb_dev endpoint */ // ifp = dev->actconfig->interface + i; as = ifp->altsetting + ifp->act_altsetting; ep = as->endpoint; pAd->BulkOutMaxPacketSize = (USHORT)ep[i].wMaxPacketSize; DBGPRINT(RT_DEBUG_TRACE, "BulkOutMaxPacketSize %d\n", pAd->BulkOutMaxPacketSize); } res = register_netdev(pAd->net_dev); if (res) goto out; RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST); if (usb_rtusb_init_device(pAd->net_dev)!=NDIS_STATUS_SUCCESS) goto out; DBGPRINT(RT_DEBUG_TRACE, "%s<--\n", __FUNCTION__); return pAd; out: printk("register_netdev failed err=%d\n",res); return NULL; }
NDIS_STATUS BasePortTranslateTxNBLsToTxPackets( __in PMP_PORT Port, __in PNET_BUFFER_LIST NetBufferLists, __out PMP_TX_MSDU * PacketList ) { PMP_TX_MSDU outputPacketList = NULL; PMP_TX_MSDU currentPacket, prevPacket = NULL; PMP_TX_MPDU currentFragment; USHORT fragmentIndex = 0; PNET_BUFFER_LIST currentNetBufferList = NetBufferLists, nextNetBufferList; PNET_BUFFER currentNetBuffer; NDIS_STATUS ndisStatus = NDIS_STATUS_SUCCESS; PDOT11_EXTSTA_SEND_CONTEXT osSendContext, mySendContext; // This is same for ExtAP & ExtSTA *PacketList = NULL; // Convert each NBL and NB to our structure while (currentNetBufferList != NULL) { nextNetBufferList = NET_BUFFER_LIST_NEXT_NBL(currentNetBufferList); // First the MP_TX_MSDU currentPacket = NdisAllocateFromNPagedLookasideList(&(Port->TxPacketLookaside)); if (currentPacket == NULL) { MpTrace(COMP_SEND, DBG_SERIOUS, ("Failed to allocate MP_TX_MSDU for NET_BUFFER_LIST\n")); ndisStatus = NDIS_STATUS_RESOURCES; break; } NdisZeroMemory(currentPacket, sizeof(MP_TX_MSDU )); // Populate the TX_PACKET MP_TX_MSDU_WRAPPED_NBL(currentPacket) = currentNetBufferList; // Save the TX_MSDU in the NET_BUFFER_LIST for debugging purpose MP_NBL_WRAPPED_TX_MSDU(currentNetBufferList) = currentPacket; osSendContext = MP_GET_SEND_CONTEXT(currentNetBufferList); mySendContext = MP_TX_MSDU_SEND_CONTEXT(currentPacket); NdisMoveMemory(mySendContext, osSendContext, sizeof(DOT11_EXTSTA_SEND_CONTEXT)); if (outputPacketList == NULL) { outputPacketList = currentPacket; } else { MP_TX_MSDU_NEXT_MSDU(prevPacket) = currentPacket; } // The Next NBL's PACKET would be added after the current NBL's PACKET prevPacket = currentPacket; // Now we go through the NBs in this NB fragmentIndex = 0; for (currentNetBuffer = NET_BUFFER_LIST_FIRST_NB(currentNetBufferList); currentNetBuffer != NULL; currentNetBuffer = NET_BUFFER_NEXT_NB(currentNetBuffer)) { currentFragment = NdisAllocateFromNPagedLookasideList(&(Port->TxFragmentLookaside)); if (currentFragment == NULL) { MpTrace(COMP_SEND, DBG_SERIOUS, ("Failed to allocate MP_TX_MPDU for NET_BUFFER\n")); ndisStatus = NDIS_STATUS_RESOURCES; break; } NdisZeroMemory(currentFragment, sizeof(MP_TX_MPDU )); // Populate the TX_FRAGMENT MP_TX_MPDU_WRAPPED_NB(currentFragment) = currentNetBuffer; MP_TX_MPDU_MSDU(currentFragment) = currentPacket; // Add it to the fragment list of the packet MP_TX_MSDU_MPDU_AT(currentPacket, fragmentIndex) = currentFragment; fragmentIndex++; } MP_TX_MSDU_MPDU_COUNT(currentPacket) = fragmentIndex; if (ndisStatus != NDIS_STATUS_SUCCESS) { break; } currentNetBufferList = nextNetBufferList; } if (ndisStatus != NDIS_STATUS_SUCCESS) { if (outputPacketList != NULL) { BasePortFreeTranslatedTxPackets(Port, outputPacketList); outputPacketList = NULL; } } *PacketList = outputPacketList; return ndisStatus; }
void RtmpUSB_FinalWriteTxResource(struct rt_rtmp_adapter *pAd, struct rt_tx_blk *pTxBlk, u16 totalMPDUSize, u16 TxIdx) { u8 QueIdx; struct rt_ht_tx_context *pHTTXContext; u32 fillOffset; struct rt_txinfo *pTxInfo; struct rt_txwi *pTxWI; u32 USBDMApktLen, padding; unsigned long IrqFlags; u8 *pWirelessPacket; QueIdx = pTxBlk->QueIdx; pHTTXContext = &pAd->TxContext[QueIdx]; RTMP_IRQ_LOCK(&pAd->TxContextQueueLock[QueIdx], IrqFlags); if (pHTTXContext->bCurWriting == TRUE) { fillOffset = pHTTXContext->CurWritePosition; if (((pHTTXContext->ENextBulkOutPosition == pHTTXContext->CurWritePosition) || ((pHTTXContext->ENextBulkOutPosition - 8) == pHTTXContext->CurWritePosition)) && (pHTTXContext->bCopySavePad == TRUE)) pWirelessPacket = (u8 *)(&pHTTXContext->SavedPad[0]); else pWirelessPacket = (u8 *)(&pHTTXContext->TransferBuffer->field. WirelessPacket[fillOffset]); /* */ /* Update TxInfo->USBDMApktLen , */ /* the length = TXWI_SIZE + 802.11_hdr + 802.11_hdr_pad + payload_of_all_batch_frames + Bulk-Out-padding */ /* */ pTxInfo = (struct rt_txinfo *)(pWirelessPacket); /* Calculate the bulk-out padding */ USBDMApktLen = pTxBlk->Priv - TXINFO_SIZE; padding = (4 - (USBDMApktLen % 4)) & 0x03; /* round up to 4 byte alignment */ USBDMApktLen += padding; pTxInfo->USBDMATxPktLen = USBDMApktLen; /* */ /* Update TXWI->MPDUtotalByteCount , */ /* the length = 802.11 header + payload_of_all_batch_frames */ pTxWI = (struct rt_txwi *) (pWirelessPacket + TXINFO_SIZE); pTxWI->MPDUtotalByteCount = totalMPDUSize; /* */ /* Update the pHTTXContext->CurWritePosition */ /* */ pHTTXContext->CurWritePosition += (TXINFO_SIZE + USBDMApktLen); if ((pHTTXContext->CurWritePosition + 3906) > MAX_TXBULK_LIMIT) { /* Add 3906 for prevent the NextBulkOut packet size is a A-RALINK/A-MSDU Frame. */ pHTTXContext->CurWritePosition = 8; pTxInfo->SwUseLastRound = 1; } pHTTXContext->CurWriteRealPos = pHTTXContext->CurWritePosition; /* */ /* Zero the last padding. */ /* */ pWirelessPacket = (&pHTTXContext->TransferBuffer->field. WirelessPacket[fillOffset + pTxBlk->Priv]); NdisZeroMemory(pWirelessPacket, padding + 8); /* Finally, set bCurWriting as FALSE */ pHTTXContext->bCurWriting = FALSE; } else { /* It should not happened now unless we are going to shutdown. */ DBGPRINT(RT_DEBUG_ERROR, ("FinalWriteTxResource():bCurWriting is FALSE when handle last frames.\n")); } RTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[QueIdx], IrqFlags); }
u16 RtmpUSB_WriteFragTxResource(struct rt_rtmp_adapter *pAd, struct rt_tx_blk *pTxBlk, u8 fragNum, u16 * FreeNumber) { struct rt_ht_tx_context *pHTTXContext; u16 hwHdrLen; /* The hwHdrLen consist of 802.11 header length plus the header padding length. */ u32 fillOffset; struct rt_txinfo *pTxInfo; struct rt_txwi *pTxWI; u8 *pWirelessPacket = NULL; u8 QueIdx; int Status; unsigned long IrqFlags; u32 USBDMApktLen = 0, DMAHdrLen, padding; BOOLEAN TxQLastRound = FALSE; /* */ /* get Tx Ring Resource & Dma Buffer address */ /* */ QueIdx = pTxBlk->QueIdx; pHTTXContext = &pAd->TxContext[QueIdx]; RTMP_IRQ_LOCK(&pAd->TxContextQueueLock[QueIdx], IrqFlags); pHTTXContext = &pAd->TxContext[QueIdx]; fillOffset = pHTTXContext->CurWritePosition; if (fragNum == 0) { /* Check if we have enough space for this bulk-out batch. */ Status = RtmpUSBCanDoWrite(pAd, QueIdx, pHTTXContext); if (Status == NDIS_STATUS_SUCCESS) { pHTTXContext->bCurWriting = TRUE; /* Reserve space for 8 bytes padding. */ if ((pHTTXContext->ENextBulkOutPosition == pHTTXContext->CurWritePosition)) { pHTTXContext->ENextBulkOutPosition += 8; pHTTXContext->CurWritePosition += 8; fillOffset += 8; } pTxBlk->Priv = 0; pHTTXContext->CurWriteRealPos = pHTTXContext->CurWritePosition; } else { RTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[QueIdx], IrqFlags); RELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_FAILURE); return (Status); } } else { /* For sub-sequent frames of this bulk-out batch. Just copy it to our bulk-out buffer. */ Status = ((pHTTXContext->bCurWriting == TRUE) ? NDIS_STATUS_SUCCESS : NDIS_STATUS_FAILURE); if (Status == NDIS_STATUS_SUCCESS) { fillOffset += pTxBlk->Priv; } else { RTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[QueIdx], IrqFlags); RELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_FAILURE); return (Status); } } NdisZeroMemory((u8 *)(&pTxBlk->HeaderBuf[0]), TXINFO_SIZE); pTxInfo = (struct rt_txinfo *)(&pTxBlk->HeaderBuf[0]); pTxWI = (struct rt_txwi *) (&pTxBlk->HeaderBuf[TXINFO_SIZE]); pWirelessPacket = &pHTTXContext->TransferBuffer->field.WirelessPacket[fillOffset]; /* copy TXWI + WLAN Header + LLC into DMA Header Buffer */ /*hwHdrLen = ROUND_UP(pTxBlk->MpduHeaderLen, 4); */ hwHdrLen = pTxBlk->MpduHeaderLen + pTxBlk->HdrPadLen; /* Build our URB for USBD */ DMAHdrLen = TXWI_SIZE + hwHdrLen; USBDMApktLen = DMAHdrLen + pTxBlk->SrcBufLen; padding = (4 - (USBDMApktLen % 4)) & 0x03; /* round up to 4 byte alignment */ USBDMApktLen += padding; pTxBlk->Priv += (TXINFO_SIZE + USBDMApktLen); /* For TxInfo, the length of USBDMApktLen = TXWI_SIZE + 802.11 header + payload */ RTMPWriteTxInfo(pAd, pTxInfo, (u16)(USBDMApktLen), FALSE, FIFO_EDCA, FALSE /*NextValid */ , FALSE); if (fragNum == pTxBlk->TotalFragNum) { pTxInfo->USBDMATxburst = 0; if ((pHTTXContext->CurWritePosition + pTxBlk->Priv + 3906) > MAX_TXBULK_LIMIT) { pTxInfo->SwUseLastRound = 1; TxQLastRound = TRUE; } } else { pTxInfo->USBDMATxburst = 1; } NdisMoveMemory(pWirelessPacket, pTxBlk->HeaderBuf, TXINFO_SIZE + TXWI_SIZE + hwHdrLen); pWirelessPacket += (TXINFO_SIZE + TXWI_SIZE + hwHdrLen); pHTTXContext->CurWriteRealPos += (TXINFO_SIZE + TXWI_SIZE + hwHdrLen); RTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[QueIdx], IrqFlags); NdisMoveMemory(pWirelessPacket, pTxBlk->pSrcBufData, pTxBlk->SrcBufLen); /* Zero the last padding. */ pWirelessPacket += pTxBlk->SrcBufLen; NdisZeroMemory(pWirelessPacket, padding + 8); if (fragNum == pTxBlk->TotalFragNum) { RTMP_IRQ_LOCK(&pAd->TxContextQueueLock[QueIdx], IrqFlags); /* Update the pHTTXContext->CurWritePosition. 3906 used to prevent the NextBulkOut is a A-RALINK/A-MSDU Frame. */ pHTTXContext->CurWritePosition += pTxBlk->Priv; if (TxQLastRound == TRUE) pHTTXContext->CurWritePosition = 8; pHTTXContext->CurWriteRealPos = pHTTXContext->CurWritePosition; /* Finally, set bCurWriting as FALSE */ pHTTXContext->bCurWriting = FALSE; RTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[QueIdx], IrqFlags); /* succeed and release the skb buffer */ RELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_SUCCESS); } return (Status); }
MAC_TABLE_ENTRY *MacTableInsertEntry( IN RTMP_ADAPTER *pAd, IN UCHAR *pAddr, IN struct wifi_dev *wdev, IN UINT32 ent_type, IN UCHAR OpMode, IN BOOLEAN CleanAll) { UCHAR HashIdx; int i, FirstWcid; MAC_TABLE_ENTRY *pEntry = NULL, *pCurrEntry; STA_TR_ENTRY *tr_entry = NULL; if (pAd->MacTab.Size >= MAX_LEN_OF_MAC_TABLE) return NULL; FirstWcid = 1; /* allocate one MAC entry*/ NdisAcquireSpinLock(&pAd->MacTabLock); for (i = FirstWcid; i< MAX_LEN_OF_MAC_TABLE; i++) /* skip entry#0 so that "entry index == AID" for fast lookup*/ { /* pick up the first available vacancy*/ if (IS_ENTRY_NONE(&pAd->MacTab.Content[i])) { pEntry = &pAd->MacTab.Content[i]; tr_entry = &pAd->MacTab.tr_entry[i]; mac_entry_reset(pAd, pEntry, CleanAll); /* ENTRY PREEMPTION: initialize the entry */ pEntry->wdev = wdev; pEntry->wcid = i; pEntry->func_tb_idx = wdev->func_idx; pEntry->bIAmBadAtheros = FALSE; pEntry->pAd = pAd; pEntry->CMTimerRunning = FALSE; COPY_MAC_ADDR(pEntry->Addr, pAddr); pEntry->Sst = SST_NOT_AUTH; pEntry->AuthState = AS_NOT_AUTH; pEntry->Aid = (USHORT)i; pEntry->CapabilityInfo = 0; pEntry->AssocDeadLine = MAC_TABLE_ASSOC_TIMEOUT; pEntry->PsMode = PWR_ACTIVE; pEntry->NoDataIdleCount = 0; pEntry->ContinueTxFailCnt = 0; #ifdef WDS_SUPPORT pEntry->LockEntryTx = FALSE; #endif /* WDS_SUPPORT */ pEntry->TimeStamp_toTxRing = 0; // TODO: shiang-usw, remove upper setting becasue we need to migrate to tr_entry! pAd->MacTab.tr_entry[i].PsMode = PWR_ACTIVE; pAd->MacTab.tr_entry[i].NoDataIdleCount = 0; pAd->MacTab.tr_entry[i].ContinueTxFailCnt = 0; pAd->MacTab.tr_entry[i].LockEntryTx = FALSE; pAd->MacTab.tr_entry[i].TimeStamp_toTxRing = 0; pAd->MacTab.tr_entry[i].PsDeQWaitCnt = 0; pEntry->EnqueueEapolStartTimerRunning = EAPOL_START_DISABLE; pEntry->GTKState = REKEY_NEGOTIATING; pEntry->PairwiseKey.KeyLen = 0; pEntry->PairwiseKey.CipherAlg = CIPHER_NONE; pEntry->PMKID_CacheIdx = ENTRY_NOT_FOUND; pEntry->RSNIE_Len = 0; NdisZeroMemory(pEntry->R_Counter, sizeof(pEntry->R_Counter)); pEntry->ReTryCounter = PEER_MSG1_RETRY_TIMER_CTR; tr_entry->PortSecured = WPA_802_1X_PORT_NOT_SECURED; do { #ifdef CONFIG_AP_SUPPORT #ifdef APCLI_SUPPORT if (ent_type == ENTRY_APCLI) { SET_ENTRY_APCLI(pEntry); //SET_ENTRY_AP(pEntry);//Carter, why set entry to APCLI then set to AP???? COPY_MAC_ADDR(pEntry->bssid, pAddr); pEntry->AuthMode = pAd->ApCfg.ApCliTab[pEntry->func_tb_idx].wdev.AuthMode; pEntry->WepStatus = pAd->ApCfg.ApCliTab[pEntry->func_tb_idx].wdev.WepStatus; if (pEntry->AuthMode < Ndis802_11AuthModeWPA) { pEntry->WpaState = AS_NOTUSE; pEntry->PrivacyFilter = Ndis802_11PrivFilterAcceptAll; } else { pEntry->WpaState = AS_PTKSTART; pEntry->PrivacyFilter = Ndis802_11PrivFilter8021xWEP; } break; } #endif /* APCLI_SUPPORT */ #ifdef WDS_SUPPORT if (ent_type == ENTRY_WDS) { SET_ENTRY_WDS(pEntry); COPY_MAC_ADDR(pEntry->bssid, pAd->ApCfg.MBSSID[MAIN_MBSSID].wdev.bssid); pEntry->AuthMode = Ndis802_11AuthModeOpen; pEntry->WepStatus = Ndis802_11EncryptionDisabled; break; } #endif /* WDS_SUPPORT */ #endif /* CONFIG_AP_SUPPORT */ #ifdef CONFIG_AP_SUPPORT if (ent_type == ENTRY_CLIENT) { /* be a regular-entry*/ if ((pEntry->func_tb_idx < pAd->ApCfg.BssidNum) && (pEntry->func_tb_idx < MAX_MBSSID_NUM(pAd)) && ((pEntry->func_tb_idx < HW_BEACON_MAX_NUM)) && (pAd->ApCfg.MBSSID[pEntry->func_tb_idx].MaxStaNum != 0) && (pAd->ApCfg.MBSSID[pEntry->func_tb_idx].StaCount >= pAd->ApCfg.MBSSID[pEntry->func_tb_idx].MaxStaNum)) { DBGPRINT(RT_DEBUG_WARN, ("%s: The connection table is full in ra%d.\n", __FUNCTION__, pEntry->func_tb_idx)); NdisReleaseSpinLock(&pAd->MacTabLock); return NULL; } ASSERT((wdev == &pAd->ApCfg.MBSSID[pEntry->func_tb_idx].wdev)); SET_ENTRY_CLIENT(pEntry); pEntry->pMbss = &pAd->ApCfg.MBSSID[pEntry->func_tb_idx]; MBSS_MR_APIDX_SANITY_CHECK(pAd, pEntry->func_tb_idx); COPY_MAC_ADDR(pEntry->bssid, wdev->bssid); pEntry->AuthMode = wdev->AuthMode; pEntry->WepStatus = wdev->WepStatus; pEntry->GroupKeyWepStatus = wdev->GroupKeyWepStatus; if (pEntry->AuthMode < Ndis802_11AuthModeWPA) pEntry->WpaState = AS_NOTUSE; else pEntry->WpaState = AS_INITIALIZE; pEntry->PrivacyFilter = Ndis802_11PrivFilterAcceptAll; pEntry->StaIdleTimeout = pAd->ApCfg.StaIdleTimeout; pAd->ApCfg.MBSSID[pEntry->func_tb_idx].StaCount++; pAd->ApCfg.EntryClientCount++; break; } #endif /* CONFIG_AP_SUPPORT */ } while (FALSE); tr_tb_set_entry(pAd, i, pEntry); #ifdef DATA_QUEUE_RESERVE tr_entry->high_pkt_cnt = 0; tr_entry->high_pkt_drop_cnt = 0; #endif /* DATA_QUEUE_RESERVE */ RTMPInitTimer(pAd, &pEntry->EnqueueStartForPSKTimer, GET_TIMER_FUNCTION(EnqueueStartForPSKExec), pEntry, FALSE); #ifdef CONFIG_AP_SUPPORT { if (IS_ENTRY_CLIENT(pEntry)) /* Only Client entry need the retry timer.*/ { RTMPInitTimer(pAd, &pEntry->RetryTimer, GET_TIMER_FUNCTION(WPARetryExec), pEntry, FALSE); #ifdef DOT11W_PMF_SUPPORT RTMPInitTimer(pAd, &pEntry->SAQueryTimer, GET_TIMER_FUNCTION(PMF_SAQueryTimeOut), pEntry, FALSE); RTMPInitTimer(pAd, &pEntry->SAQueryConfirmTimer, GET_TIMER_FUNCTION(PMF_SAQueryConfirmTimeOut), pEntry, FALSE); #endif /* DOT11W_PMF_SUPPORT */ #if defined(MT_MAC) && defined(WSC_INCLUDED) && defined(CONFIG_AP_SUPPORT) RTMPInitTimer(pAd, &pEntry->EapReqIdRetryTimer, GET_TIMER_FUNCTION(WscEapReqIdRetryTimeout), pEntry, TRUE); pEntry->bEapReqIdRetryTimerRunning = FALSE; #endif /* defined(MT_MAC) && defined(WSC_INCLUDED) && defined(CONFIG_AP_SUPPORT) */ } #ifdef APCLI_SUPPORT if (IS_ENTRY_APCLI(pEntry)) { RTMPInitTimer(pAd, &pEntry->RetryTimer, GET_TIMER_FUNCTION(WPARetryExec), pEntry, FALSE); #ifdef DOT11W_PMF_SUPPORT RTMPInitTimer(pAd, &pEntry->SAQueryTimer, GET_TIMER_FUNCTION(PMF_SAQueryTimeOut), pEntry, FALSE); RTMPInitTimer(pAd, &pEntry->SAQueryConfirmTimer, GET_TIMER_FUNCTION(PMF_SAQueryConfirmTimeOut), pEntry, FALSE); #endif /* DOT11W_PMF_SUPPORT */ } #endif /* APCLI_SUPPORT */ } #endif /* CONFIG_AP_SUPPORT */ #ifdef STREAM_MODE_SUPPORT /* Enable Stream mode for first three entries in MAC table */ #endif /* STREAM_MODE_SUPPORT */ #ifdef UAPSD_SUPPORT /* Ralink WDS doesn't support any power saving.*/ if (IS_ENTRY_CLIENT(pEntry) #if defined(DOT11Z_TDLS_SUPPORT) || defined(CFG_TDLS_SUPPORT) || IS_ENTRY_TDLS(pEntry) #endif /* defined(DOT11Z_TDLS_SUPPORT) || defined(CFG_TDLS_SUPPORT) */ ) { /* init U-APSD enhancement related parameters */ DBGPRINT(RT_DEBUG_TRACE, ("%s(): INIT UAPSD MR ENTRY",__FUNCTION__)); UAPSD_MR_ENTRY_INIT(pEntry); } #endif /* UAPSD_SUPPORT */ pAd->MacTab.Size ++; /* Set the security mode of this entry as OPEN-NONE in ASIC */ RTMP_REMOVE_PAIRWISE_KEY_ENTRY(pAd, (UCHAR)i); #ifdef MT_MAC if (pAd->chipCap.hif_type == HIF_MT) MT_ADDREMOVE_KEY(pAd, 1, pEntry->func_tb_idx, 0, pEntry->wcid, PAIRWISEKEYTABLE, &pEntry->PairwiseKey, pEntry->Addr); #endif /* Add this entry into ASIC RX WCID search table */ RTMP_STA_ENTRY_ADD(pAd, pEntry); #ifdef CONFIG_AP_SUPPORT IF_DEV_CONFIG_OPMODE_ON_AP(pAd) { #ifdef WSC_AP_SUPPORT pEntry->bWscCapable = FALSE; pEntry->Receive_EapolStart_EapRspId = 0; #endif /* WSC_AP_SUPPORT */ } #endif /* CONFIG_AP_SUPPORT */ DBGPRINT(RT_DEBUG_TRACE, ("%s(): alloc entry #%d, Total= %d\n", __FUNCTION__, i, pAd->MacTab.Size)); break; } }
VOID StaInitializeStationConfig( __in PSTATION pStation ) { PSTA_CURRENT_CONFIG pConfig = &pStation->Config; // // free PrivacyExemptionList // if (pConfig->PrivacyExemptionList) { MP_FREE_MEMORY(pStation->Config.PrivacyExemptionList); } // // free IBSS params // if (pConfig->AdditionalIEData) { MP_FREE_MEMORY(pConfig->AdditionalIEData); } // // Any dynamically allocated structure must be freed prior to this point. // NdisZeroMemory(pConfig, sizeof(STA_CURRENT_CONFIG)); pConfig->BSSType = dot11_BSS_type_infrastructure; // Wildcard SSID pConfig->SSID.uSSIDLength = 0; // Setup to accept an BSSID pConfig->DesiredBSSIDList[0][0] = 0xFF; pConfig->DesiredBSSIDList[0][1] = 0xFF; pConfig->DesiredBSSIDList[0][2] = 0xFF; pConfig->DesiredBSSIDList[0][3] = 0xFF; pConfig->DesiredBSSIDList[0][4] = 0xFF; pConfig->DesiredBSSIDList[0][5] = 0xFF; pConfig->DesiredBSSIDCount = 1; pConfig->AcceptAnyBSSID = TRUE; // // Reset other configuration parameters. // pConfig->UnreachableDetectionThreshold = 2000; pConfig->ExcludeUnencrypted = FALSE; pConfig->AID = 0; pConfig->ValidAID = FALSE; pConfig->ListenInterval = 3; // TODO: FIX this. pConfig->MediaStreamingEnabled = FALSE; pConfig->UnicastUseGroupEnabled = TRUE; pConfig->HiddenNetworkEnabled = FALSE; // // Reset desired PHY ID list // pConfig->DesiredPhyCount = 1; pConfig->DesiredPhyList[0] = DOT11_PHY_ID_ANY; pConfig->ActivePhyId = DOT11_PHY_ID_ANY; // // This is scan specific setting // pStation->ScanContext.SSIDInProbeRequest = TRUE; // True until we go to low power state }
NDIS_STATUS SxLibIssueOidRequest( _In_ PSX_SWITCH_OBJECT Switch, _In_ NDIS_REQUEST_TYPE RequestType, _In_ NDIS_OID Oid, _In_opt_ PVOID InformationBuffer, _In_ ULONG InformationBufferLength, _In_ ULONG OutputBufferLength, _In_ ULONG MethodId, _In_ UINT Timeout, _Out_ PULONG BytesNeeded ) { NDIS_STATUS status; PSX_OID_REQUEST oidRequest; PNDIS_OID_REQUEST ndisOidRequest; ULONG bytesNeeded; BOOLEAN asyncCompletion; status = NDIS_STATUS_SUCCESS; oidRequest = NULL; bytesNeeded = 0; asyncCompletion = FALSE; NdisInterlockedIncrement(&Switch->PendingOidCount); if (Switch->ControlFlowState != SxSwitchAttached) { status = NDIS_STATUS_CLOSING; goto Cleanup; } // // Dynamically allocate filter request so that we can handle asynchronous // completion. // oidRequest = (PSX_OID_REQUEST)ExAllocatePoolWithTag(NonPagedPoolNx, sizeof(SX_OID_REQUEST), SxExtAllocationTag); if (oidRequest == NULL) { goto Cleanup; } NdisZeroMemory(oidRequest, sizeof(SX_OID_REQUEST)); ndisOidRequest = &oidRequest->NdisOidRequest; NdisInitializeEvent(&oidRequest->ReqEvent); ndisOidRequest->Header.Type = NDIS_OBJECT_TYPE_OID_REQUEST; ndisOidRequest->Header.Revision = NDIS_OID_REQUEST_REVISION_1; ndisOidRequest->Header.Size = sizeof(NDIS_OID_REQUEST); ndisOidRequest->RequestType = RequestType; ndisOidRequest->Timeout = Timeout; switch (RequestType) { case NdisRequestQueryInformation: ndisOidRequest->DATA.QUERY_INFORMATION.Oid = Oid; ndisOidRequest->DATA.QUERY_INFORMATION.InformationBuffer = InformationBuffer; ndisOidRequest->DATA.QUERY_INFORMATION.InformationBufferLength = InformationBufferLength; break; case NdisRequestSetInformation: ndisOidRequest->DATA.SET_INFORMATION.Oid = Oid; ndisOidRequest->DATA.SET_INFORMATION.InformationBuffer = InformationBuffer; ndisOidRequest->DATA.SET_INFORMATION.InformationBufferLength = InformationBufferLength; break; case NdisRequestMethod: ndisOidRequest->DATA.METHOD_INFORMATION.Oid = Oid; ndisOidRequest->DATA.METHOD_INFORMATION.MethodId = MethodId; ndisOidRequest->DATA.METHOD_INFORMATION.InformationBuffer = InformationBuffer; ndisOidRequest->DATA.METHOD_INFORMATION.InputBufferLength = InformationBufferLength; ndisOidRequest->DATA.METHOD_INFORMATION.OutputBufferLength = OutputBufferLength; break; default: NT_ASSERT(FALSE); break; } ndisOidRequest->RequestId = (PVOID)SxExtOidRequestId; status = NdisFOidRequest(Switch->NdisFilterHandle, ndisOidRequest); if (status == NDIS_STATUS_PENDING) { asyncCompletion = TRUE; NdisWaitEvent(&oidRequest->ReqEvent, 0); } else { SxpNdisCompleteInternalOidRequest(Switch, ndisOidRequest, status); } bytesNeeded = oidRequest->BytesNeeded; status = oidRequest->Status; Cleanup: if (BytesNeeded != NULL) { *BytesNeeded = bytesNeeded; } if (!asyncCompletion) { NdisInterlockedDecrement(&Switch->PendingOidCount); } if (oidRequest != NULL) { ExFreePoolWithTag(oidRequest, SxExtAllocationTag); } return status; }
VOID SxLibIssueNicStatusIndicationUnsafe( _In_ PSX_SWITCH_OBJECT Switch, _In_ NDIS_STATUS StatusCode, _In_ NDIS_SWITCH_PORT_ID PortId, _In_ NDIS_SWITCH_NIC_INDEX NicIndex, _In_ BOOLEAN IsDestination, _In_opt_ PVOID StatusBuffer, _In_ ULONG StatusBufferSize ) { NDIS_STATUS_INDICATION statusIndication; NDIS_STATUS_INDICATION wrappedIndication; NDIS_SWITCH_NIC_STATUS_INDICATION nicIndication; NdisZeroMemory(&wrappedIndication, sizeof(wrappedIndication)); wrappedIndication.Header.Type = NDIS_OBJECT_TYPE_STATUS_INDICATION; wrappedIndication.Header.Revision = NDIS_STATUS_INDICATION_REVISION_1; wrappedIndication.Header.Size = NDIS_SIZEOF_STATUS_INDICATION_REVISION_1; wrappedIndication.SourceHandle = Switch->NdisFilterHandle; wrappedIndication.PortNumber = NDIS_DEFAULT_PORT_NUMBER; wrappedIndication.StatusCode = StatusCode; wrappedIndication.StatusBuffer = StatusBuffer; wrappedIndication.StatusBufferSize = StatusBufferSize; NdisZeroMemory(&nicIndication, sizeof(nicIndication)); nicIndication.Header.Type = NDIS_OBJECT_TYPE_DEFAULT; nicIndication.Header.Revision = NDIS_SWITCH_NIC_STATUS_INDICATION_REVISION_1; nicIndication.Header.Size = NDIS_SIZEOF_SWITCH_NIC_STATUS_REVISION_1; nicIndication.StatusIndication = &wrappedIndication; if (IsDestination) { nicIndication.DestinationPortId = PortId; nicIndication.DestinationNicIndex = NicIndex; } else { nicIndication.SourcePortId = PortId; nicIndication.SourceNicIndex = NicIndex; } NdisZeroMemory(&statusIndication, sizeof(statusIndication)); statusIndication.Header.Type = NDIS_OBJECT_TYPE_STATUS_INDICATION; statusIndication.Header.Revision = NDIS_STATUS_INDICATION_REVISION_1; statusIndication.Header.Size = NDIS_SIZEOF_STATUS_INDICATION_REVISION_1; statusIndication.SourceHandle = Switch->NdisFilterHandle; statusIndication.PortNumber = NDIS_DEFAULT_PORT_NUMBER; statusIndication.StatusCode = NDIS_STATUS_SWITCH_NIC_STATUS; statusIndication.StatusBuffer = &nicIndication; statusIndication.StatusBufferSize = sizeof(nicIndication); NdisFIndicateStatus(Switch->NdisFilterHandle, &statusIndication); }
NDIS_STATUS GingkoNdisRegisterDevice( VOID ) /*++ Routine Description: Register an ioctl interface - a device object to be used for this purpose is created by NDIS when we call NdisMRegisterDevice. This routine is called whenever a new miniport instance is initialized. However, we only create one global device object, when the first miniport instance is initialized. This routine handles potential race conditions with PtDeregisterDevice via the ControlDeviceState and MiniportCount variables. NOTE: do not call this from DriverEntry; it will prevent the driver from being unloaded (e.g. on uninstall). Arguments: None Return Value: NDIS_STATUS_SUCCESS if we successfully register a device object. --*/ { NDIS_STATUS Status = NDIS_STATUS_SUCCESS; UNICODE_STRING DeviceName; UNICODE_STRING DeviceLinkUnicodeString; PDRIVER_DISPATCH DispatchTable[IRP_MJ_MAXIMUM_FUNCTION+1]; KdPrint(("==>PtRegisterDevice\n")); NdisAcquireSpinLock(&GlobalLock); ++MiniportCount; if (1 == MiniportCount) { ASSERT(ControlDeviceState != PS_DEVICE_STATE_CREATING); // // Another thread could be running PtDeregisterDevice on // behalf of another miniport instance. If so, wait for // it to exit. // while (ControlDeviceState != PS_DEVICE_STATE_READY) { NdisReleaseSpinLock(&GlobalLock); NdisMSleep(1); NdisAcquireSpinLock(&GlobalLock); } ControlDeviceState = PS_DEVICE_STATE_CREATING; NdisReleaseSpinLock(&GlobalLock); NdisZeroMemory(DispatchTable, (IRP_MJ_MAXIMUM_FUNCTION+1) * sizeof(PDRIVER_DISPATCH)); DispatchTable[IRP_MJ_CREATE] = GingkoNdisDispatch; DispatchTable[IRP_MJ_CLEANUP] = GingkoNdisDispatch; DispatchTable[IRP_MJ_CLOSE] = GingkoNdisDispatch; DispatchTable[IRP_MJ_DEVICE_CONTROL] = GingkoNdisDispatch; NdisInitUnicodeString(&DeviceName, NTDEVICE_STRING); NdisInitUnicodeString(&DeviceLinkUnicodeString, LINKNAME_STRING); // // Create a device object and register our dispatch handlers // Status = NdisMRegisterDevice( NdisWrapperHandle, &DeviceName, &DeviceLinkUnicodeString, &DispatchTable[0], &ControlDeviceObject, &NdisDeviceHandle ); NdisAcquireSpinLock(&GlobalLock); ControlDeviceState = PS_DEVICE_STATE_READY; } NdisReleaseSpinLock(&GlobalLock); KdPrint(("<==PtRegisterDevice: %x\n", Status)); return (Status); }
NTSTATUS GingkoNdisDriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ) { NDIS_STATUS Status; NDIS_PROTOCOL_CHARACTERISTICS PChars; NDIS_MINIPORT_CHARACTERISTICS MChars; NDIS_STRING Name; Status = NDIS_STATUS_SUCCESS; NdisAllocateSpinLock(&GlobalLock); NdisMInitializeWrapper(&NdisWrapperHandle, DriverObject, RegistryPath, NULL); KdPrint(("Calling NdisMInitializeWrapper Before\n")); do { // // Register the miniport with NDIS. Note that it is the miniport // which was started as a driver and not the protocol. Also the miniport // must be registered prior to the protocol since the protocol's BindAdapter // handler can be initiated anytime and when it is, it must be ready to // start driver instances. // NdisZeroMemory(&MChars, sizeof(NDIS_MINIPORT_CHARACTERISTICS)); MChars.MajorNdisVersion = PASSTHRU_MAJOR_NDIS_VERSION; MChars.MinorNdisVersion = PASSTHRU_MINOR_NDIS_VERSION; MChars.InitializeHandler = GingkoNdisInitialize; MChars.QueryInformationHandler = GingkoNdisQueryInformation; MChars.SetInformationHandler = GingkoNdisSetInformation; MChars.ResetHandler = NULL; MChars.TransferDataHandler = GingkoNdisTransferData; MChars.HaltHandler = GingkoNdisHalt; #ifdef NDIS51_MINIPORT MChars.CancelSendPacketsHandler = GingkoNdisCancelSendPackets; MChars.PnPEventNotifyHandler = GingkoNdisDevicePnPEvent; MChars.AdapterShutdownHandler = GingkoNdisAdapterShutdown; #endif // NDIS51_MINIPORT // // We will disable the check for hang timeout so we do not // need a check for hang handler! // MChars.CheckForHangHandler = NULL; MChars.ReturnPacketHandler = GingkoNdisReturnPacket; // // Either the Send or the SendPackets handler should be specified. // If SendPackets handler is specified, SendHandler is ignored // MChars.SendHandler = NULL; // MPSend; MChars.SendPacketsHandler = GingkoNdisSendPackets; Status = NdisIMRegisterLayeredMiniport(NdisWrapperHandle, &MChars, sizeof(MChars), &DriverHandle); KdPrint(("Calling NdisIMRegisterLayeredMiniport After\n")); ///return 0; if (Status != NDIS_STATUS_SUCCESS) { break; } #ifndef WIN9X NdisMRegisterUnloadHandler(NdisWrapperHandle, GingkoNdisUnload); #endif // // Now register the protocol. // NdisZeroMemory(&PChars, sizeof(NDIS_PROTOCOL_CHARACTERISTICS)); PChars.MajorNdisVersion = PASSTHRU_PROT_MAJOR_NDIS_VERSION; PChars.MinorNdisVersion = PASSTHRU_PROT_MINOR_NDIS_VERSION; // // Make sure the protocol-name matches the service-name // (from the INF) under which this protocol is installed. // This is needed to ensure that NDIS can correctly determine // the binding and call us to bind to miniports below. // NdisInitUnicodeString(&Name, L"GingkoFilter"); // Protocol name PChars.Name = Name; PChars.OpenAdapterCompleteHandler = GingkoNdisOpenAdapterComplete; PChars.CloseAdapterCompleteHandler = GingkoNdisCloseAdapterComplete; PChars.SendCompleteHandler = GingkoNdisSendComplete; PChars.TransferDataCompleteHandler = GingkoNdisTransferDataComplete; PChars.ResetCompleteHandler = GingkoNdisResetComplete; PChars.RequestCompleteHandler = GingkoNdisRequestComplete; PChars.ReceiveHandler = GingkoNdisReceive; PChars.ReceiveCompleteHandler = GingkoNdisReceiveComplete; PChars.StatusHandler = GingkoNdisStatus; PChars.StatusCompleteHandler = GingkoNdisStatusComplete; PChars.BindAdapterHandler = GingkoNdisBindAdapter; PChars.UnbindAdapterHandler = GingkoNdisUnbindAdapter; PChars.UnloadHandler = GingkoNdisUnloadProtocol; PChars.ReceivePacketHandler = GingkoNdisReceivePacket; PChars.PnPEventHandler= GingkoNdisPNPHandler; NdisRegisterProtocol(&Status, &ProtHandle, &PChars, sizeof(NDIS_PROTOCOL_CHARACTERISTICS)); KdPrint(("Calling NdisRegisterProtocol After\n")); if (Status != NDIS_STATUS_SUCCESS) { NdisIMDeregisterLayeredMiniport(DriverHandle); break; } NdisIMAssociateMiniport(DriverHandle, ProtHandle); KdPrint(("Calling NdisIMAssociateMiniport After\n")); } while (FALSE); if (Status != NDIS_STATUS_SUCCESS) { NdisTerminateWrapper(NdisWrapperHandle, NULL); } return(Status); }
/* ========================================================================== Description: ========================================================================== */ static VOID ApCliEnqueueProbeRequest( IN PRTMP_ADAPTER pAd, IN UCHAR SsidLen, OUT PCHAR Ssid, IN USHORT ifIndex) { NDIS_STATUS NState; PUCHAR pOutBuffer; ULONG FrameLen = 0; HEADER_802_11 Hdr80211; UCHAR SsidIe = IE_SSID; UCHAR SupRateIe = IE_SUPP_RATES; UCHAR ssidLen; CHAR ssid[MAX_LEN_OF_SSID]; APCLI_STRUCT *pApCliEntry = NULL; BOOLEAN bHasWscIe = FALSE; MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("force out a ProbeRequest ...\n")); if (ifIndex >= MAX_APCLI_NUM) return; pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; NState = MlmeAllocateMemory(pAd, &pOutBuffer); /* Get an unused nonpaged memory */ if(NState != NDIS_STATUS_SUCCESS) { MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("EnqueueProbeRequest() allocate memory fail\n")); return; } else { if(MAC_ADDR_EQUAL(pAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid, ZERO_MAC_ADDR)) ApCliMgtMacHeaderInit(pAd, &Hdr80211, SUBTYPE_PROBE_REQ, 0, BROADCAST_ADDR, BROADCAST_ADDR, ifIndex); else ApCliMgtMacHeaderInit(pAd, &Hdr80211, SUBTYPE_PROBE_REQ, 0, pAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid, pAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid, ifIndex); ssidLen = SsidLen; NdisZeroMemory(ssid, MAX_LEN_OF_SSID); NdisMoveMemory(ssid, Ssid, ssidLen); /* this ProbeRequest explicitly specify SSID to reduce unwanted ProbeResponse */ MakeOutgoingFrame(pOutBuffer, &FrameLen, sizeof(HEADER_802_11), &Hdr80211, 1, &SsidIe, 1, &ssidLen, ssidLen, ssid, 1, &SupRateIe, 1, &pApCliEntry->MlmeAux.SupRateLen, pApCliEntry->MlmeAux.SupRateLen, pApCliEntry->MlmeAux.SupRate, END_OF_ARGS); /* Add the extended rate IE */ if (pApCliEntry->MlmeAux.ExtRateLen != 0) { ULONG tmp; MakeOutgoingFrame(pOutBuffer + FrameLen, &tmp, 1, &ExtRateIe, 1, &pApCliEntry->MlmeAux.ExtRateLen, pApCliEntry->MlmeAux.ExtRateLen, pApCliEntry->MlmeAux.ExtRate, END_OF_ARGS); FrameLen += tmp; } #ifdef DOT11_VHT_AC if (WMODE_CAP_AC(pAd->CommonCfg.PhyMode) && (pAd->CommonCfg.Channel > 14)) { FrameLen += build_vht_ies(pAd, (UCHAR *)(pOutBuffer + FrameLen), SUBTYPE_PROBE_REQ); } #endif /* DOT11_VHT_AC */ #if defined(RT_CFG80211_P2P_CONCURRENT_DEVICE) || defined(CFG80211_MULTI_STA) if ((pAd->StaCfg.wpa_supplicant_info.WpaSupplicantUP != WPA_SUPPLICANT_DISABLE) && (pAd->cfg80211_ctrl.ExtraIeLen > 0)) { ULONG ExtraIeTmpLen = 0; MakeOutgoingFrame(pOutBuffer+ FrameLen, &ExtraIeTmpLen, pAd->cfg80211_ctrl.ExtraIeLen, pAd->cfg80211_ctrl.pExtraIe, END_OF_ARGS); FrameLen += ExtraIeTmpLen; } #endif /* RT_CFG80211_P2P_CONCURRENT_DEVICE || CFG80211_MULTI_STA */ if ((pAd->ApCfg.ApCliTab[ifIndex].WscControl.WscConfMode != WSC_DISABLE) && (pAd->ApCfg.ApCliTab[ifIndex].WscControl.bWscTrigger)) { bHasWscIe = TRUE; } #ifdef WSC_V2_SUPPORT else if (pAd->ApCfg.ApCliTab[ifIndex].WscControl.WscV2Info.bEnableWpsV2) { bHasWscIe = TRUE; } #endif /* WSC_V2_SUPPORT */ if (bHasWscIe) { UCHAR /* WscBuf[256], */ WscIeLen = 0; UCHAR *WscBuf = NULL; ULONG WscTmpLen = 0; /* allocate memory */ os_alloc_mem(NULL, (UCHAR **)&WscBuf, 512); if (WscBuf != NULL) { NdisZeroMemory(WscBuf, 512); WscBuildProbeReqIE(pAd, STA_MODE, WscBuf, &WscIeLen); MakeOutgoingFrame(pOutBuffer + FrameLen, &WscTmpLen, WscIeLen, WscBuf, END_OF_ARGS); FrameLen += WscTmpLen; os_free_mem(NULL, WscBuf); } else MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("%s: Allocate memory fail!!!\n", __FUNCTION__)); } MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen); MlmeFreeMemory(pAd, pOutBuffer); } return; }
NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ) /*++ Routine Description: First entry point to be called, when this driver is loaded. Register with NDIS as an intermediate driver. Arguments: DriverObject - pointer to the system's driver object structure for this driver RegistryPath - system's registry path for this driver Return Value: STATUS_SUCCESS if all initialization is successful, STATUS_XXX error code if not. --*/ { NDIS_STATUS Status; NDIS_PROTOCOL_DRIVER_CHARACTERISTICS PChars; NDIS_MINIPORT_DRIVER_CHARACTERISTICS MChars; NDIS_HANDLE MiniportDriverContext; NDIS_HANDLE ProtocolDriverContext; NDIS_STRING Name; NdisInitializeListHead(&AdapterList); NdisInitializeListHead(&VElanList); MiniportDriverContext=NULL; ProtocolDriverContext=NULL; MUX_INIT_MUTEX(&GlobalMutex); MUX_INIT_MUTEX(&ControlDeviceMutex); NdisAllocateSpinLock(&GlobalLock); do { // // Register the miniport with NDIS. Note that it is the // miniport which was started as a driver and not the protocol. // Also the miniport must be registered prior to the protocol // since the protocol's BindAdapter handler can be initiated // anytime and when it is, it must be ready to // start driver instances. // NdisZeroMemory(&MChars, sizeof(NDIS_MINIPORT_DRIVER_CHARACTERISTICS)); MChars.Header.Type = NDIS_OBJECT_TYPE_DEFAULT; MChars.Header.Size = sizeof(NDIS_MINIPORT_DRIVER_CHARACTERISTICS); MChars.Header.Revision = NDIS_MINIPORT_DRIVER_CHARACTERISTICS_REVISION_1; MChars.MajorNdisVersion = MUX_MAJOR_NDIS_VERSION; MChars.MinorNdisVersion = MUX_MINOR_NDIS_VERSION; MChars.MajorDriverVersion = MUX_MAJOR_DRIVER_VERSION; MChars.MinorDriverVersion = MUX_MINOR_DRIVER_VERSION; MChars.SetOptionsHandler = MpSetOptions; MChars.InitializeHandlerEx = MPInitialize; MChars.UnloadHandler = MPUnload; MChars.HaltHandlerEx = MPHalt; MChars.OidRequestHandler = MPOidRequest; MChars.CancelSendHandler = MPCancelSendNetBufferLists; MChars.DevicePnPEventNotifyHandler = MPDevicePnPEvent; MChars.ShutdownHandlerEx = MPAdapterShutdown; MChars.CancelOidRequestHandler = MPCancelOidRequest; // // We will disable the check for hang timeout so we do not // need a check for hang handler! // MChars.CheckForHangHandlerEx = NULL; MChars.ReturnNetBufferListsHandler = MPReturnNetBufferLists; MChars.SendNetBufferListsHandler = MPSendNetBufferLists; MChars.PauseHandler = MPPause; MChars.RestartHandler = MPRestart; MChars.Flags = NDIS_INTERMEDIATE_DRIVER; Status = NdisMRegisterMiniportDriver(DriverObject, RegistryPath, MiniportDriverContext, &MChars, &DriverHandle); if (Status != NDIS_STATUS_SUCCESS) { break; } // // Now register the protocol. // NdisZeroMemory(&PChars, sizeof(NDIS_PROTOCOL_DRIVER_CHARACTERISTICS)); PChars.Header.Type = NDIS_OBJECT_TYPE_DEFAULT; PChars.Header.Size = sizeof(NDIS_PROTOCOL_DRIVER_CHARACTERISTICS); PChars.Header.Revision = NDIS_PROTOCOL_DRIVER_CHARACTERISTICS_REVISION_1; PChars.MajorNdisVersion = MUX_PROT_MAJOR_NDIS_VERSION; PChars.MinorNdisVersion = MUX_PROT_MINOR_NDIS_VERSION; PChars.MajorDriverVersion = MUX_MAJOR_DRIVER_VERSION; PChars.MinorDriverVersion = MUX_MINOR_DRIVER_VERSION; PChars.SetOptionsHandler = PtSetOptions; // // Make sure the protocol-name matches the service-name // (from the INF) under which this protocol is installed. // This is needed to ensure that NDIS can correctly determine // the binding and call us to bind to miniports below. // NdisInitUnicodeString(&Name, L"MUXP"); // Protocol name PChars.Name = Name; PChars.OpenAdapterCompleteHandlerEx = PtOpenAdapterComplete; PChars.CloseAdapterCompleteHandlerEx = PtCloseAdapterComplete; PChars.ReceiveNetBufferListsHandler = PtReceiveNBL; PChars.SendNetBufferListsCompleteHandler = PtSendNBLComplete; PChars.OidRequestCompleteHandler = PtRequestComplete; PChars.StatusHandlerEx = PtStatus; PChars.BindAdapterHandlerEx = PtBindAdapter; PChars.UnbindAdapterHandlerEx = PtUnbindAdapter; PChars.NetPnPEventHandler= PtPNPHandler; Status = NdisRegisterProtocolDriver(ProtocolDriverContext, &PChars, &ProtHandle); if (Status != NDIS_STATUS_SUCCESS) { NdisMDeregisterMiniportDriver(DriverHandle); break; } // // Let NDIS know of the association between our protocol // and miniport entities. // NdisIMAssociateMiniport(DriverHandle, ProtHandle); }while (FALSE); return(Status); }
NTSTATUS DriverEntry(__in PDRIVER_OBJECT DriverObject, __in PUNICODE_STRING RegistryPath) /*++ Routine Description: In the context of its DriverEntry function, a miniport driver associates itself with NDIS, specifies the NDIS version that it is using, and registers its entry points. Arguments: PVOID DriverObject - pointer to the driver object. PVOID RegistryPath - pointer to the driver registry path. Return Value: NTSTATUS code --*/ { NTSTATUS status; UNREFERENCED_PARAMETER(RegistryPath); DEBUGP(("[TAP] --> DriverEntry; version [%d.%d] %s %s\n", TAP_DRIVER_MAJOR_VERSION, TAP_DRIVER_MINOR_VERSION, __DATE__, __TIME__)); DEBUGP(("[TAP] Registry Path: '%wZ'\n", RegistryPath)); // // Initialize any driver-global variables here. // NdisZeroMemory(&GlobalData, sizeof(GlobalData)); // // The ApaterList in the GlobalData structure is used to track multiple // adapters controlled by this miniport. // NdisInitializeListHead(&GlobalData.AdapterList); // // This lock protects the AdapterList. // NdisInitializeReadWriteLock(&GlobalData.Lock); do { NDIS_MINIPORT_DRIVER_CHARACTERISTICS miniportCharacteristics; NdisZeroMemory(&miniportCharacteristics, sizeof(miniportCharacteristics)); { C_ASSERT(sizeof(miniportCharacteristics) >= NDIS_SIZEOF_MINIPORT_DRIVER_CHARACTERISTICS_REVISION_2); } miniportCharacteristics.Header.Type = NDIS_OBJECT_TYPE_MINIPORT_DRIVER_CHARACTERISTICS; miniportCharacteristics.Header.Size = NDIS_SIZEOF_MINIPORT_DRIVER_CHARACTERISTICS_REVISION_2; miniportCharacteristics.Header.Revision = NDIS_MINIPORT_DRIVER_CHARACTERISTICS_REVISION_2; miniportCharacteristics.MajorNdisVersion = TAP_NDIS_MAJOR_VERSION; miniportCharacteristics.MinorNdisVersion = TAP_NDIS_MINOR_VERSION; miniportCharacteristics.MajorDriverVersion = TAP_DRIVER_MAJOR_VERSION; miniportCharacteristics.MinorDriverVersion = TAP_DRIVER_MINOR_VERSION; miniportCharacteristics.Flags = 0; // miniportCharacteristics.SetOptionsHandler = MPSetOptions; // Optional miniportCharacteristics.InitializeHandlerEx = AdapterCreate; miniportCharacteristics.HaltHandlerEx = AdapterHalt; miniportCharacteristics.UnloadHandler = TapDriverUnload; miniportCharacteristics.PauseHandler = AdapterPause; miniportCharacteristics.RestartHandler = AdapterRestart; miniportCharacteristics.OidRequestHandler = AdapterOidRequest; miniportCharacteristics.SendNetBufferListsHandler = AdapterSendNetBufferLists; miniportCharacteristics.ReturnNetBufferListsHandler = AdapterReturnNetBufferLists; miniportCharacteristics.CancelSendHandler = AdapterCancelSend; miniportCharacteristics.CheckForHangHandlerEx = AdapterCheckForHangEx; miniportCharacteristics.ResetHandlerEx = AdapterReset; miniportCharacteristics.DevicePnPEventNotifyHandler = AdapterDevicePnpEventNotify; miniportCharacteristics.ShutdownHandlerEx = AdapterShutdownEx; miniportCharacteristics.CancelOidRequestHandler = AdapterCancelOidRequest; // // Associate the miniport driver with NDIS by calling the // NdisMRegisterMiniportDriver. This function returns an NdisDriverHandle. // The miniport driver must retain this handle but it should never attempt // to access or interpret this handle. // // By calling NdisMRegisterMiniportDriver, the driver indicates that it // is ready for NDIS to call the driver's MiniportSetOptions and // MiniportInitializeEx handlers. // DEBUGP(("[TAP] Calling NdisMRegisterMiniportDriver...\n")); // NDIS_DECLARE_MINIPORT_DRIVER_CONTEXT(TAP_GLOBAL); status = NdisMRegisterMiniportDriver(DriverObject, RegistryPath, &GlobalData, &miniportCharacteristics, &GlobalData.NdisDriverHandle); if (NDIS_STATUS_SUCCESS == status) { DEBUGP(("[TAP] Registered miniport successfully\n")); } else { DEBUGP(("[TAP] NdisMRegisterMiniportDriver failed: %8.8X\n", status)); TapDriverUnload(DriverObject); status = NDIS_STATUS_FAILURE; break; } } while (FALSE); DEBUGP(("[TAP] <-- DriverEntry; status = %8.8X\n", status)); return status; }
u16 RtmpUSB_WriteSingleTxResource(struct rt_rtmp_adapter *pAd, struct rt_tx_blk *pTxBlk, IN BOOLEAN bIsLast, u16 * FreeNumber) { struct rt_ht_tx_context *pHTTXContext; u16 hwHdrLen; u32 fillOffset; struct rt_txinfo *pTxInfo; struct rt_txwi *pTxWI; u8 *pWirelessPacket; u8 QueIdx; unsigned long IrqFlags; int Status; u32 USBDMApktLen = 0, DMAHdrLen, padding; BOOLEAN bTxQLastRound = FALSE; /* For USB, didn't need PCI_MAP_SINGLE() */ /*SrcBufPA = PCI_MAP_SINGLE(pAd, (char *) pTxBlk->pSrcBufData, pTxBlk->SrcBufLen, PCI_DMA_TODEVICE); */ /* */ /* get Tx Ring Resource & Dma Buffer address */ /* */ QueIdx = pTxBlk->QueIdx; RTMP_IRQ_LOCK(&pAd->TxContextQueueLock[QueIdx], IrqFlags); pHTTXContext = &pAd->TxContext[QueIdx]; fillOffset = pHTTXContext->CurWritePosition; /* Check ring full. */ Status = RtmpUSBCanDoWrite(pAd, QueIdx, pHTTXContext); if (Status == NDIS_STATUS_SUCCESS) { pHTTXContext->bCurWriting = TRUE; pTxInfo = (struct rt_txinfo *)(&pTxBlk->HeaderBuf[0]); pTxWI = (struct rt_txwi *) (&pTxBlk->HeaderBuf[TXINFO_SIZE]); /* Reserve space for 8 bytes padding. */ if ((pHTTXContext->ENextBulkOutPosition == pHTTXContext->CurWritePosition)) { pHTTXContext->ENextBulkOutPosition += 8; pHTTXContext->CurWritePosition += 8; fillOffset += 8; } pHTTXContext->CurWriteRealPos = pHTTXContext->CurWritePosition; pWirelessPacket = &pHTTXContext->TransferBuffer->field. WirelessPacket[fillOffset]; /* copy TXWI + WLAN Header + LLC into DMA Header Buffer */ /*hwHdrLen = ROUND_UP(pTxBlk->MpduHeaderLen, 4); */ hwHdrLen = pTxBlk->MpduHeaderLen + pTxBlk->HdrPadLen; /* Build our URB for USBD */ DMAHdrLen = TXWI_SIZE + hwHdrLen; USBDMApktLen = DMAHdrLen + pTxBlk->SrcBufLen; padding = (4 - (USBDMApktLen % 4)) & 0x03; /* round up to 4 byte alignment */ USBDMApktLen += padding; pTxBlk->Priv = (TXINFO_SIZE + USBDMApktLen); /* For TxInfo, the length of USBDMApktLen = TXWI_SIZE + 802.11 header + payload */ RTMPWriteTxInfo(pAd, pTxInfo, (u16)(USBDMApktLen), FALSE, FIFO_EDCA, FALSE /*NextValid */ , FALSE); if ((pHTTXContext->CurWritePosition + 3906 + pTxBlk->Priv) > MAX_TXBULK_LIMIT) { pTxInfo->SwUseLastRound = 1; bTxQLastRound = TRUE; } NdisMoveMemory(pWirelessPacket, pTxBlk->HeaderBuf, TXINFO_SIZE + TXWI_SIZE + hwHdrLen); pWirelessPacket += (TXINFO_SIZE + TXWI_SIZE + hwHdrLen); /* We unlock it here to prevent the first 8 bytes maybe over-writed issue. */ /* 1. First we got CurWritePosition but the first 8 bytes still not write to the pTxcontext. */ /* 2. An interrupt break our routine and handle bulk-out complete. */ /* 3. In the bulk-out compllete, it need to do another bulk-out, */ /* if the ENextBulkOutPosition is just the same as CurWritePosition, it will save the first 8 bytes from CurWritePosition, */ /* but the payload still not copyed. the pTxContext->SavedPad[] will save as allzero. and set the bCopyPad = TRUE. */ /* 4. Interrupt complete. */ /* 5. Our interrupted routine go back and fill the first 8 bytes to pTxContext. */ /* 6. Next time when do bulk-out, it found the bCopyPad==TRUE and will copy the SavedPad[] to pTxContext->NextBulkOutPosition. */ /* and the packet will wrong. */ pHTTXContext->CurWriteRealPos += (TXINFO_SIZE + TXWI_SIZE + hwHdrLen); RTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[QueIdx], IrqFlags); NdisMoveMemory(pWirelessPacket, pTxBlk->pSrcBufData, pTxBlk->SrcBufLen); pWirelessPacket += pTxBlk->SrcBufLen; NdisZeroMemory(pWirelessPacket, padding + 8); RTMP_IRQ_LOCK(&pAd->TxContextQueueLock[QueIdx], IrqFlags); pHTTXContext->CurWritePosition += pTxBlk->Priv; if (bTxQLastRound) pHTTXContext->CurWritePosition = 8; pHTTXContext->CurWriteRealPos = pHTTXContext->CurWritePosition; pHTTXContext->bCurWriting = FALSE; } RTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[QueIdx], IrqFlags); /* succeed and release the skb buffer */ RELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_SUCCESS); return (Status); }
VOID FT_OTD_PeerRspAtSeq2Action( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { UCHAR TargetAddr[MAC_ADDR_LEN]; USHORT Status; BOOLEAN TimerCancelled; ULONG BssIdx = 0; FT_FTIE FtIe; FT_MDIE MdIe; PFRAME_802_11 pFrame = (PFRAME_802_11) Elem->Msg; MLME_ASSOC_REQ_STRUCT AssocReq; UCHAR BBPValue = 0; DBGPRINT(RT_DEBUG_TRACE, ("FT_OTD_ACTION - PeerFtRspAtSeq2Action MlmeAux.Bssid = %02x:%02x:%02x:%02x:%02x:%02x\n", PRINT_MAC(pAd->MlmeAux.Bssid))); if (PeerFtRspSanity (pAd, Elem->Msg, Elem->MsgLen, TargetAddr, &FtIe, &MdIe, &Status)) { if (MAC_ADDR_EQUAL(pAd->CommonCfg.Bssid, pFrame->Hdr.Addr2)) { DBGPRINT(RT_DEBUG_TRACE, ("FT_OTD_ACTION - Receive FT_RSP seq#2 to me ( Status=%d)\n", Status)); RTMPCancelTimer(&pAd->MlmeAux.FtOtdActTimer, &TimerCancelled); if (Status == MLME_SUCCESS) { UINT8 ptk_len; PMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[MCAST_WCID]; NdisMoveMemory(pEntry->SNonce, FtIe.SNonce, 32); /* Get ANonce from authentication-response */ NdisMoveMemory(pEntry->ANonce, FtIe.ANonce, 32); hex_dump("anonce", pEntry->ANonce, 32); hex_dump("snonce", pEntry->SNonce, 32); FT_DerivePMKR1(pAd->StaCfg.Dot11RCommInfo.PMKR0, pAd->StaCfg.Dot11RCommInfo.PMKR0Name, TargetAddr, /*pAd->MlmeAux.Bssid, */ pAd->CurrentAddress, pEntry->FT_PMK_R1, pEntry->FT_PMK_R1_NAME); if (pEntry->WepStatus == Ndis802_11TKIPEnable) ptk_len = 32 + 32; else ptk_len = 32 + 16; /* Derive FT PTK and PTK-NAME */ FT_DerivePTK(pEntry->FT_PMK_R1, pEntry->FT_PMK_R1_NAME, pEntry->ANonce, pEntry->SNonce, TargetAddr, /*pAd->MlmeAux.Bssid, */ pAd->CurrentAddress, ptk_len, pEntry->PTK, pEntry->PTK_NAME); /* How to know there is resource request session now ???????? */ if ((pAd->StaCfg.Dot11RCommInfo.bSupportResource) && (pAd->MlmeAux.MdIeInfo.FtCapPlc.field.RsrReqCap)) { /* Prepare to send FT Confirm packet. */ DBGPRINT(RT_DEBUG_TRACE, ("FT_OTD_ACTION - Receive FT_RSP seq#2 to me, Prepare to send FT Confirm. \n")); pAd->Mlme.FtOtdActMachine.CurrState = FT_OTD_WAIT_SEQ4; } else { BSS_ENTRY *pBss = NULL; /* Doesn't need to send FT Confirm packet. */ DBGPRINT(RT_DEBUG_TRACE, ("FT_OTD_ACTION - Receive FT_RSP seq#2 to me, Prepare to send Reassoc. \n")); pAd->StaCfg.Dot11RCommInfo.FtRspSuccess = FT_OTD_RESPONSE; pAd->Mlme.FtOtdActMachine.CurrState = FT_OTD_IDLE; RTMPMoveMemory(pAd->MlmeAux.Bssid, TargetAddr, MAC_ADDR_LEN); /* find the desired BSS in the latest SCAN result table search 2.4G band first */ BssIdx = BssTableSearch(&pAd->ScanTab, TargetAddr, 1); /* search 5G band, if AP does not exist in 2.4G band */ if (BssIdx == BSS_NOT_FOUND) BssIdx = BssTableSearch(&pAd->ScanTab, TargetAddr, 36); if (BssIdx == BSS_NOT_FOUND) { DBGPRINT(RT_DEBUG_TRACE, ("FT_OTD_ACTION - BSSID not found. reply NDIS_STATUS_NOT_ACCEPTED\n")); pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE; return; } pBss = &pAd->ScanTab.BssEntry[BssIdx]; pAd->MlmeAux.Channel = pBss->Channel; pAd->MlmeAux.CentralChannel = pBss->CentralChannel; RTMPZeroMemory(pAd->MlmeAux.ExtRate, MAX_LEN_OF_SUPPORTED_RATES); RTMPZeroMemory(pAd->MlmeAux.SupRate, MAX_LEN_OF_SUPPORTED_RATES); pAd->MlmeAux.ExtRateLen = pBss->ExtRateLen; RTMPMoveMemory(pAd->MlmeAux.ExtRate, pBss->ExtRate, pBss->ExtRateLen); pAd->MlmeAux.SupRateLen = pBss->SupRateLen; RTMPMoveMemory(pAd->MlmeAux.SupRate, pBss->SupRate, pBss->SupRateLen); RTMPZeroMemory(pAd->MlmeAux.Ssid, MAX_LEN_OF_SSID); pAd->MlmeAux.SsidLen = pBss->SsidLen; RTMPMoveMemory(pAd->MlmeAux.Ssid, pBss->Ssid, pBss->SsidLen); /* StaActive.SupportedHtPhy.MCSSet stores Peer AP's 11n Rx capability */ if (pBss->HtCapabilityLen) { RTMPMoveMemory(pAd->StaActive.SupportedPhyInfo.MCSSet, pBss->HtCapability.MCSSet, 16); } else { NdisZeroMemory(pAd->StaActive.SupportedPhyInfo.MCSSet, 16); } bbp_set_bw(pAd, BW_20); AsicSwitchChannel(pAd, pAd->MlmeAux.Channel, FALSE); AsicLockChannel(pAd, pAd->MlmeAux.Channel); RTMPUpdateMlmeRate(pAd); AssocParmFill(pAd, &AssocReq, pAd->MlmeAux.Bssid, pAd->MlmeAux.CapabilityInfo, ASSOC_TIMEOUT, pAd->StaCfg.DefaultListenCount); MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_REASSOC_REQ, sizeof (MLME_ASSOC_REQ_STRUCT), &AssocReq, 0); pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_REASSOC; } } else { pAd->StaCfg.AuthFailReason = Status; COPY_MAC_ADDR(pAd->StaCfg.AuthFailSta, pFrame->Hdr.Addr2); pAd->Mlme.FtOtdActMachine.CurrState = FT_OTD_IDLE; MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_FT_OTD_CONF, 2, &Status, 0); } } } else { DBGPRINT(RT_DEBUG_TRACE, ("FT_OTD_ACTION - PeerFtRspSanity() sanity check fail\n")); } }
/* Must be run in Interrupt context This function handle RT2870 specific TxDesc and cpu index update and kick the packet out. */ int RtmpUSBMgmtKickOut(struct rt_rtmp_adapter *pAd, u8 QueIdx, void *pPacket, u8 *pSrcBufVA, u32 SrcBufLen) { struct rt_txinfo *pTxInfo; unsigned long BulkOutSize; u8 padLen; u8 *pDest; unsigned long SwIdx = pAd->MgmtRing.TxCpuIdx; struct rt_tx_context *pMLMEContext = (struct rt_tx_context *)pAd->MgmtRing.Cell[SwIdx].AllocVa; unsigned long IrqFlags; pTxInfo = (struct rt_txinfo *)(pSrcBufVA); /* Build our URB for USBD */ BulkOutSize = SrcBufLen; BulkOutSize = (BulkOutSize + 3) & (~3); RTMPWriteTxInfo(pAd, pTxInfo, (u16)(BulkOutSize - TXINFO_SIZE), TRUE, EpToQueue[MGMTPIPEIDX], FALSE, FALSE); BulkOutSize += 4; /* Always add 4 extra bytes at every packet. */ /* If BulkOutSize is multiple of BulkOutMaxPacketSize, add extra 4 bytes again. */ if ((BulkOutSize % pAd->BulkOutMaxPacketSize) == 0) BulkOutSize += 4; padLen = BulkOutSize - SrcBufLen; ASSERT((padLen <= RTMP_PKT_TAIL_PADDING)); /* Now memzero all extra padding bytes. */ pDest = (u8 *)(pSrcBufVA + SrcBufLen); skb_put(GET_OS_PKT_TYPE(pPacket), padLen); NdisZeroMemory(pDest, padLen); RTMP_IRQ_LOCK(&pAd->MLMEBulkOutLock, IrqFlags); pAd->MgmtRing.Cell[pAd->MgmtRing.TxCpuIdx].pNdisPacket = pPacket; pMLMEContext->TransferBuffer = (struct rt_tx_buffer *)(GET_OS_PKT_DATAPTR(pPacket)); /* Length in TxInfo should be 8 less than bulkout size. */ pMLMEContext->BulkOutSize = BulkOutSize; pMLMEContext->InUse = TRUE; pMLMEContext->bWaitingBulkOut = TRUE; /*for debug */ /*hex_dump("RtmpUSBMgmtKickOut", &pMLMEContext->TransferBuffer->field.WirelessPacket[0], (pMLMEContext->BulkOutSize > 16 ? 16 : pMLMEContext->BulkOutSize)); */ /*pAd->RalinkCounters.KickTxCount++; */ /*pAd->RalinkCounters.OneSecTxDoneCount++; */ /*if (pAd->MgmtRing.TxSwFreeIdx == MGMT_RING_SIZE) */ /* needKickOut = TRUE; */ /* Decrease the TxSwFreeIdx and Increase the TX_CTX_IDX */ pAd->MgmtRing.TxSwFreeIdx--; INC_RING_INDEX(pAd->MgmtRing.TxCpuIdx, MGMT_RING_SIZE); RTMP_IRQ_UNLOCK(&pAd->MLMEBulkOutLock, IrqFlags); RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_MLME); /*if (needKickOut) */ RTUSBKickBulkOut(pAd); return 0; }
static INT CFG80211_DummyP2pIf_Close( IN PNET_DEV dev_p) { struct wireless_dev *wdev = dev_p->ieee80211_ptr; #ifdef RT_CFG80211_P2P_STATIC_CONCURRENT_DEVICE VOID *pAdSrc; pAdSrc = RTMP_OS_NETDEV_GET_PRIV(dev_p); ASSERT(pAdSrc); PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc; PCFG80211_CTRL cfg80211_ctrl = &pAd->cfg80211_ctrl; BOOLEAN isGoOn = FALSE; UINT apidx = 1; struct wifi_dev *Wdev; #endif /* RT_CFG80211_P2P_STATIC_CONCURRENT_DEVICE */ if (!wdev) return -EINVAL; #ifdef RT_CFG80211_P2P_STATIC_CONCURRENT_DEVICE if (pAd->flg_apcli_init) { DBGPRINT(RT_DEBUG_TRACE, ("ApCli_Close\n")); CFG80211OS_ScanEnd(pAd->pCfg80211_CB, TRUE); // RT_MOD_DEC_USE_COUNT(); ApCli_Close(pAd, dev_p); } DBGPRINT(RT_DEBUG_TRACE, ("%s: ===> %s\n", __FUNCTION__, RTMP_OS_NETDEV_GET_DEVNAME(dev_p))); RTMP_OS_NETDEV_STOP_QUEUE(dev_p); if (INFRA_ON(pAd)) AsicEnableBssSync(pAd,100); else if (ADHOC_ON(pAd)) AsicEnableIbssSync(pAd); else AsicDisableSync(pAd); //VIRTUAL_IF_DOWN(pAd); if (cfg80211_ctrl->dummy_p2p_net_dev) { //iverson if (isGoOn) { Wdev = &pAd->ApCfg.MBSSID[apidx].wdev; wdev_bcn_buf_deinit(pAd, &pAd->ApCfg.MBSSID[apidx].bcn_buf); rtmp_wdev_idx_unreg(pAd, Wdev); Wdev->if_dev = NULL; } else if (pAd->flg_apcli_init) { Wdev = &pAd->ApCfg.ApCliTab[MAIN_MBSSID].wdev; OPSTATUS_CLEAR_FLAG(pAd, fOP_AP_STATUS_MEDIA_STATE_CONNECTED); cfg80211_disconnected(dev_p, 0, NULL, 0, GFP_KERNEL); CFG80211OS_ScanEnd(pAd->pCfg80211_CB, TRUE); NdisZeroMemory(pAd->ApCfg.ApCliTab[MAIN_MBSSID].CfgApCliBssid, MAC_ADDR_LEN); // RtmpOSNetDevDetach(dev_p); rtmp_wdev_idx_unreg(pAd, Wdev); pAd->flg_apcli_init = FALSE; // Wdev->if_dev = NULL; } } AsicSetBssid(pAd, pAd->cfg80211_ctrl.P2PCurrentAddress, 0x1); AsicSetBssid(pAd, pAd->CurrentAddress, 0x0); #endif /* RT_CFG80211_P2P_STATIC_CONCURRENT_DEVICE */ wdev->wiphy->interface_modes = (wdev->wiphy->interface_modes) & (~(BIT(NL80211_IFTYPE_P2P_CLIENT) | BIT(NL80211_IFTYPE_P2P_GO) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0)) | BIT(RT_CMD_80211_IFTYPE_P2P_DEVICE) #endif /* LINUX_VERSION_CODE: 3.7.0 */ )); #ifdef RT_CFG80211_P2P_STATIC_CONCURRENT_DEVICE RT_MOD_DEC_USE_COUNT(); #endif /* RT_CFG80211_P2P_STATIC_CONCURRENT_DEVICE */ return 0; }
static int usb_rtusb_probe (struct usb_interface *intf, const struct usb_device_id *id) { struct usb_device *dev = interface_to_usbdev(intf); PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)NULL; int i; struct net_device *netdev; int res = -ENOMEM; DBGPRINT(RT_DEBUG_TRACE, "%s-->\n", __FUNCTION__); usb_get_dev(dev); for (i = 0; i < rtusb_usb_id_len; i++) { if (dev->descriptor.idVendor == rtusb_usb_id[i].idVendor && dev->descriptor.idProduct == rtusb_usb_id[i].idProduct) { printk("idVendor = 0x%x, idProduct = 0x%x \n",dev->descriptor.idVendor, dev->descriptor.idProduct); break; } } if (i == rtusb_usb_id_len) { printk("Device Descriptor not matching\n"); return res; } netdev = alloc_etherdev(sizeof(PRTMP_ADAPTER)); if(!netdev) { printk("alloc_etherdev failed\n"); return res; } RTMP_OS_NETDEV_SET_PRIV(netdev,(PVOID)vmalloc(sizeof(RTMP_ADAPTER))); pAd=RTMP_OS_NETDEV_GET_PRIV(netdev); //netdev->priv = (PVOID)vmalloc(sizeof(RTMP_ADAPTER)); //pAd = netdev->priv; if(!pAd) { free_netdev(netdev); printk("vmalloc failed\n"); return res; } NdisZeroMemory(pAd, sizeof(RTMP_ADAPTER)); pAd->net_dev = netdev; netif_stop_queue(netdev); pAd->config = &dev->config->desc; pAd->pUsb_Dev = dev; //--> Benson add 20080505, for Linux_kernel > 2,6,24 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) SET_MODULE_OWNER(pAd->net_dev); #endif //<-- Benson end 20080505 ether_setup(pAd->net_dev); netdev->priv_flags = INT_MAIN; netdev->open = usb_rtusb_open; netdev->stop = usb_rtusb_close; //netdev->priv = pAd; netdev->hard_start_xmit = usb_rtusb_sendpkt; netdev->get_stats = rt73_get_ether_stats; #if (WIRELESS_EXT >= 12) #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) netdev->get_wireless_stats = rt73_get_wireless_stats; #endif netdev->wireless_handlers = (struct iw_handler_def *) &rt73_iw_handler_def; #endif netdev->do_ioctl = rt73_ioctl; pAd->net_dev->hard_header_len = 14; pAd->net_dev->mtu = 1500; pAd->net_dev->addr_len = 6; //--> Benson add 20080505, for Linux_kernel > 2,6,24 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) pAd->net_dev->weight = 64; #endif //<-- Benson end 20080505 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED); pAd->MLMEThr_pid= THREAD_PID_INIT_VALUE; pAd->RTUSBCmdThr_pid= THREAD_PID_INIT_VALUE; #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)) SET_ETHTOOL_OPS(pAd->net_dev, &rt73_ethtool_ops); #endif #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)) SET_NETDEV_DEV(pAd->net_dev, &(intf->dev)); #endif {// find available int i=0; char slot_name[IFNAMSIZ]; struct usb_host_interface *iface_desc; struct usb_endpoint_descriptor *endpoint; struct net_device *device; for (i = 0; i < 8; i++) { sprintf(slot_name, "rausb%d", i); #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24) #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26) device = dev_get_by_name(dev_net(netdev), slot_name); #else device = dev_get_by_name(netdev->nd_net, slot_name); #endif #else device = dev_get_by_name(slot_name); #endif if (device == NULL) break; /* fine, the RA name is not used */ else { /* every time dev_get_by_name is called, and it has returned a valid struct net_device*, dev_put should be called afterwards, because otherwise the machine hangs when the device is unregistered (since dev->refcnt > 1). */ dev_put(device); } } if(i == 8) { DBGPRINT(RT_DEBUG_ERROR, "No available slot name\n"); return res; } sprintf(pAd->net_dev->name, "rausb%d", i); DBGPRINT(RT_DEBUG_ERROR, "usb device name %s\n", pAd->net_dev->name); /* get the active interface descriptor */ iface_desc = intf->cur_altsetting; /* check out the endpoint: it has to be Interrupt & IN */ endpoint = &iface_desc->endpoint[i].desc; /* get Max Packet Size from endpoint */ pAd->BulkOutMaxPacketSize = (USHORT)endpoint->wMaxPacketSize; DBGPRINT(RT_DEBUG_TRACE, "BulkOutMaxPacketSize %d\n", pAd->BulkOutMaxPacketSize); } res = register_netdev(pAd->net_dev); if (res) goto out; usb_set_intfdata(intf, pAd); RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST); if (usb_rtusb_init_device(pAd->net_dev)!=NDIS_STATUS_SUCCESS) goto out; pAd->ProbeFinish = TRUE; //RTUSBBulkReceive(pAd); DBGPRINT(RT_DEBUG_TRACE, "%s<--\n", __FUNCTION__); return 0; out: printk("register_netdev failed err=%d\n",res); free_netdev(netdev); return -1; }
VOID RTMP_CFG80211_VirtualIF_Init( IN VOID *pAdSrc, IN CHAR *pDevName, IN UINT32 DevType) { #ifdef RT_CFG80211_P2P_STATIC_CONCURRENT_DEVICE return; #endif /* RT_CFG80211_P2P_STATIC_CONCURRENT_DEVICE */ PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc; RTMP_OS_NETDEV_OP_HOOK netDevHook, *pNetDevOps; PNET_DEV new_dev_p; APCLI_STRUCT *pApCliEntry; struct wifi_dev *wdev; #ifdef RT_CFG80211_P2P_SUPPORT UINT apidx = CFG_GO_BSSID_IDX; #else UINT apidx = MAIN_MBSSID; #endif /*RT_CFG80211_P2P_SUPPORT*/ CHAR tr_tb_idx = MAX_LEN_OF_MAC_TABLE + apidx; CHAR preIfName[12]; UINT devNameLen = strlen(pDevName); UINT preIfIndex = pDevName[devNameLen-1] - 48; CFG80211_CB *p80211CB = pAd->pCfg80211_CB; struct wireless_dev *pWdev; UINT32 MC_RowID = 0, IoctlIF = 0, Inf = INT_P2P; memset(preIfName, 0, sizeof(preIfName)); NdisCopyMemory(preIfName, pDevName, devNameLen-1); pNetDevOps=&netDevHook; DBGPRINT(RT_DEBUG_TRACE, ("%s ---> (%s, %s, %d)\n", __FUNCTION__, pDevName, preIfName, preIfIndex)); /* init operation functions and flags */ NdisZeroMemory(&netDevHook, sizeof(netDevHook)); netDevHook.open = CFG80211_VirtualIF_Open; /* device opem hook point */ netDevHook.stop = CFG80211_VirtualIF_Close; /* device close hook point */ netDevHook.xmit = CFG80211_VirtualIF_PacketSend; /* hard transmit hook point */ netDevHook.ioctl = CFG80211_VirtualIF_Ioctl; /* ioctl hook point */ #if WIRELESS_EXT >= 12 //netDevHook.iw_handler = (void *)&rt28xx_ap_iw_handler_def; #endif /* WIRELESS_EXT >= 12 */ new_dev_p = RtmpOSNetDevCreate(MC_RowID, &IoctlIF, Inf, preIfIndex, sizeof(PRTMP_ADAPTER), preIfName); if (new_dev_p == NULL) { /* allocation fail, exit */ DBGPRINT(RT_DEBUG_ERROR, ("Allocate network device fail (CFG80211)...\n")); return; } else { DBGPRINT(RT_DEBUG_TRACE, ("Register CFG80211 I/F (%s)\n", RTMP_OS_NETDEV_GET_DEVNAME(new_dev_p))); } new_dev_p->destructor = free_netdev; RTMP_OS_NETDEV_SET_PRIV(new_dev_p, pAd); pNetDevOps->needProtcted = TRUE; NdisMoveMemory(&pNetDevOps->devAddr[0], &pAd->CurrentAddress[0], MAC_ADDR_LEN); #ifdef MT_MAC INT32 Value; UCHAR MacByte = 0; //TODO: shall we make choosing which byte to be selectable??? Value = 0x00000000L; RTMP_IO_READ32(pAd, LPON_BTEIR, &Value);//read BTEIR bit[31:29] for determine to choose which byte to extend BSSID mac address. Value = Value | (0x2 << 29);//Note: Carter, make default will use byte4 bit[31:28] to extend Mac Address RTMP_IO_WRITE32(pAd, LPON_BTEIR, Value); MacByte = Value >> 29; pNetDevOps->devAddr[0] |= 0x2; switch (MacByte) { case 0x1: /* choose bit[23:20]*/ pNetDevOps->devAddr[2] = (pNetDevOps->devAddr[2] = pNetDevOps->devAddr[2] & 0x0f); break; case 0x2: /* choose bit[31:28]*/ pNetDevOps->devAddr[3] = (pNetDevOps->devAddr[3] = pNetDevOps->devAddr[3] & 0x0f); break; case 0x3: /* choose bit[39:36]*/ pNetDevOps->devAddr[4] = (pNetDevOps->devAddr[4] = pNetDevOps->devAddr[4] & 0x0f); break; case 0x4: /* choose bit [47:44]*/ pNetDevOps->devAddr[5] = (pNetDevOps->devAddr[5] = pNetDevOps->devAddr[5] & 0x0f); break; default: /* choose bit[15:12]*/ pNetDevOps->devAddr[1] = (pNetDevOps->devAddr[1] = pNetDevOps->devAddr[1] & 0x0f); break; } AsicSetDevMac(pAd, pNetDevOps->devAddr, 0x1);//set own_mac to HWBSSID1 #else //CFG_TODO /* Bit1 of MAC address Byte0 is local administration bit and should be set to 1 in extended multiple BSSIDs' Bit3~ of MAC address Byte0 is extended multiple BSSID index. */ if (pAd->chipCap.MBSSIDMode == MBSSID_MODE1) pNetDevOps->devAddr[0] += 2; /* NEW BSSID */ else { #ifdef P2P_ODD_MAC_ADJUST if (pNetDevOps->devAddr[5] & 0x01 == 0x01) pNetDevOps->devAddr[5] -= 1; else #endif /* P2P_ODD_MAC_ADJUST */ pNetDevOps->devAddr[5] += FIRST_MBSSID; } #endif /* MT_MAC */ switch (DevType) { #ifdef CONFIG_STA_SUPPORT case RT_CMD_80211_IFTYPE_MONITOR: DBGPRINT(RT_DEBUG_TRACE, ("CFG80211 I/F Monitor Type\n")); //RTMP_OS_NETDEV_SET_TYPE_MONITOR(new_dev_p); break; case RT_CMD_80211_IFTYPE_P2P_CLIENT: case RT_CMD_80211_IFTYPE_STATION: pApCliEntry = &pAd->ApCfg.ApCliTab[MAIN_MBSSID]; wdev = &pApCliEntry->wdev; wdev->wdev_type = WDEV_TYPE_STA; wdev->func_dev = pApCliEntry; wdev->func_idx = MAIN_MBSSID; wdev->sys_handle = (void *)pAd; wdev->if_dev = new_dev_p; /* TX */ wdev->tx_pkt_allowed = ApCliAllowToSendPacket; wdev->wdev_hard_tx = APHardTransmit; wdev->tx_pkt_handle = APSendPacket; /* RX */ wdev->rx_pkt_allowed = sta_rx_pkt_allow; wdev->rx_pkt_foward = sta_rx_fwd_hnd; RTMP_OS_NETDEV_SET_PRIV(new_dev_p, pAd); RTMP_OS_NETDEV_SET_WDEV(new_dev_p, wdev); if (rtmp_wdev_idx_reg(pAd, wdev) < 0) { DBGPRINT(RT_DEBUG_ERROR, ("%s: Assign wdev idx for %s failed, free net device!\n", __FUNCTION__,RTMP_OS_NETDEV_GET_DEVNAME(new_dev_p))); RtmpOSNetDevFree(new_dev_p); break; } /* init MAC address of virtual network interface */ COPY_MAC_ADDR(wdev->if_addr, pNetDevOps->devAddr); break; #endif /*CONFIG_STA_SUPPORT*/ case RT_CMD_80211_IFTYPE_P2P_GO: /* Only ForceGO init from here, Nego as GO init on AddBeacon Ops. */ pNetDevOps->priv_flags = INT_P2P; /* The Behivaor in SetBeacon Ops */ pAd->cfg80211_ctrl.isCfgInApMode = RT_CMD_80211_IFTYPE_AP; wdev = &pAd->ApCfg.MBSSID[apidx].wdev; wdev->wdev_type = WDEV_TYPE_AP; wdev->func_dev = &pAd->ApCfg.MBSSID[apidx]; wdev->func_idx = apidx; wdev->sys_handle = (void *)pAd; wdev->if_dev = new_dev_p; /* BC/MC Handling */ wdev->tr_tb_idx = tr_tb_idx; tr_tb_set_mcast_entry(pAd, tr_tb_idx, wdev); /* TX */ wdev->tx_pkt_allowed = ApAllowToSendPacket; wdev->wdev_hard_tx = APHardTransmit; wdev->tx_pkt_handle = APSendPacket; /* RX */ wdev->rx_pkt_allowed = ap_rx_pkt_allow; wdev->rx_pkt_foward = ap_rx_foward_handle; wdev->rx_ps_handle = ap_rx_ps_handle; /* for concurrent purpose */ wdev->hw_bssid_idx = CFG_GO_BSSID_IDX; wdev_bcn_buf_init(pAd, &pAd->ApCfg.MBSSID[apidx].bcn_buf); RTMP_OS_NETDEV_SET_PRIV(new_dev_p, pAd); RTMP_OS_NETDEV_SET_WDEV(new_dev_p, wdev); if (rtmp_wdev_idx_reg(pAd, wdev) < 0) { DBGPRINT(RT_DEBUG_ERROR, ("%s: Assign wdev idx for %s failed, free net device!\n", __FUNCTION__,RTMP_OS_NETDEV_GET_DEVNAME(new_dev_p))); RtmpOSNetDevFree(new_dev_p); break; } COPY_MAC_ADDR(pAd->ApCfg.MBSSID[apidx].wdev.if_addr, pNetDevOps->devAddr); COPY_MAC_ADDR(pAd->ApCfg.MBSSID[apidx].wdev.bssid, pNetDevOps->devAddr); break; default: DBGPRINT(RT_DEBUG_ERROR, ("Unknown CFG80211 I/F Type (%d)\n", DevType)); } //CFG_TODO : should be move to VIF_CHG if ((DevType == RT_CMD_80211_IFTYPE_P2P_CLIENT) || (DevType == RT_CMD_80211_IFTYPE_P2P_GO)) { COPY_MAC_ADDR(pAd->cfg80211_ctrl.P2PCurrentAddress, pNetDevOps->devAddr); } pWdev = kzalloc(sizeof(*pWdev), GFP_KERNEL); new_dev_p->ieee80211_ptr = pWdev; pWdev->wiphy = p80211CB->pCfg80211_Wdev->wiphy; SET_NETDEV_DEV(new_dev_p, wiphy_dev(pWdev->wiphy)); pWdev->netdev = new_dev_p; pWdev->iftype = DevType; #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0)) COPY_MAC_ADDR(pWdev->address, pNetDevOps->devAddr); #endif /* LINUX_VERSION_CODE: 3.7.0 */ RtmpOSNetDevAttach(pAd->OpMode, new_dev_p, pNetDevOps); //AsicSetBssid(pAd, pAd->CurrentAddress, 0x0); //AsicSetBssid(pAd, wdev->if_addr, 0x1); /* Record the pNetDevice to Cfg80211VifDevList */ RTMP_CFG80211_AddVifEntry(pAd, new_dev_p, DevType); DBGPRINT(RT_DEBUG_TRACE, ("%s <---\n", __FUNCTION__)); }
NDIS_STATUS FilterRegisterDevice( VOID ) { NDIS_STATUS Status = NDIS_STATUS_SUCCESS; UNICODE_STRING DeviceName; UNICODE_STRING DeviceLinkUnicodeString; PDRIVER_DISPATCH DispatchTable[IRP_MJ_MAXIMUM_FUNCTION+1]; NDIS_DEVICE_OBJECT_ATTRIBUTES DeviceAttribute; PFILTER_DEVICE_EXTENSION FilterDeviceExtension; DEBUGP(DL_TRACE, "==>FilterRegisterDevice\n"); NdisZeroMemory(DispatchTable, (IRP_MJ_MAXIMUM_FUNCTION+1) * sizeof(PDRIVER_DISPATCH)); DispatchTable[IRP_MJ_CREATE] = FilterDispatch; DispatchTable[IRP_MJ_CLEANUP] = FilterDispatch; DispatchTable[IRP_MJ_CLOSE] = FilterDispatch; DispatchTable[IRP_MJ_DEVICE_CONTROL] = FilterDeviceIoControl; NdisInitUnicodeString(&DeviceName, NTDEVICE_STRING); NdisInitUnicodeString(&DeviceLinkUnicodeString, LINKNAME_STRING); // // Create a device object and register our dispatch handlers // NdisZeroMemory(&DeviceAttribute, sizeof(NDIS_DEVICE_OBJECT_ATTRIBUTES)); DeviceAttribute.Header.Type = NDIS_OBJECT_TYPE_DEVICE_OBJECT_ATTRIBUTES; DeviceAttribute.Header.Revision = NDIS_DEVICE_OBJECT_ATTRIBUTES_REVISION_1; DeviceAttribute.Header.Size = sizeof(NDIS_DEVICE_OBJECT_ATTRIBUTES); DeviceAttribute.DeviceName = &DeviceName; DeviceAttribute.SymbolicName = &DeviceLinkUnicodeString; DeviceAttribute.MajorFunctions = &DispatchTable[0]; DeviceAttribute.ExtensionSize = sizeof(FILTER_DEVICE_EXTENSION); Status = NdisRegisterDeviceEx( g_filter_driver_handle, &DeviceAttribute, &g_device_object, &g_ndis_filter_device_handle ); if (Status == NDIS_STATUS_SUCCESS) { FilterDeviceExtension = NdisGetDeviceReservedExtension(g_device_object); FilterDeviceExtension->Signature = 'FTDR'; FilterDeviceExtension->Handle = g_filter_driver_handle; } DEBUGP(DL_TRACE, "<==FilterRegisterDevice: %x\n", Status); return (Status); }
VOID RTMP_CFG80211_VirtualIF_Remove( IN VOID *pAdSrc, IN PNET_DEV dev_p, IN UINT32 DevType) { PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc; BOOLEAN isGoOn = FALSE; struct wifi_dev *wdev; #ifdef RT_CFG80211_P2P_SUPPORT UINT apidx = CFG_GO_BSSID_IDX; #else UINT apidx = MAIN_MBSSID; #endif /*RT_CFG80211_P2P_SUPPORT*/ if (dev_p) { pAd->cfg80211_ctrl.Cfg80211VifDevSet.isGoingOn = FALSE; RTMP_CFG80211_RemoveVifEntry(pAd, dev_p); RTMP_OS_NETDEV_STOP_QUEUE(dev_p); #ifdef RT_CFG80211_P2P_CONCURRENT_DEVICE isGoOn = RTMP_CFG80211_VIF_P2P_GO_ON(pAd); if (isGoOn) { wdev = &pAd->ApCfg.MBSSID[apidx].wdev; BSS_STRUCT *pMbss = &pAd->ApCfg.MBSSID[CFG_GO_BSSID_IDX]; struct wifi_dev *pwdev = &pMbss->wdev; if (pAd->Mlme.bStartScc == TRUE) { pAd->Mlme.bStartScc = FALSE; AsicSwitchChannel(pAd, pAd->StaCfg.wdev.CentralChannel, FALSE); AsicLockChannel(pAd, pAd->StaCfg.wdev.CentralChannel); bbp_set_bw(pAd, pAd->StaCfg.wdev.bw); } pwdev->channel = 0; pwdev->CentralChannel= 0; pwdev->bw = 0; pwdev->extcha = EXTCHA_NONE; /*after p2p cli connect , neet to change to default configure*/ pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_BELOW; pAd->CommonCfg.RegTransmitSetting.field.BW = BW_40; pAd->CommonCfg.HT_Disable = 0; SetCommonHT(pAd); wdev_bcn_buf_deinit(pAd, &pAd->ApCfg.MBSSID[apidx].bcn_buf); RtmpOSNetDevDetach(dev_p); rtmp_wdev_idx_unreg(pAd, wdev); wdev->if_dev = NULL; } else #endif /* RT_CFG80211_P2P_CONCURRENT_DEVICE */ if (pAd->flg_apcli_init) { wdev = &pAd->ApCfg.ApCliTab[MAIN_MBSSID].wdev; //actually not mcc still need to check this! if (pAd->Mlme.bStartScc == TRUE) { printk("GC remove & switch to Infra BW = %d pAd->StaCfg.wdev.CentralChannel %d \n",pAd->StaCfg.wdev.bw,pAd->StaCfg.wdev.CentralChannel); pAd->Mlme.bStartScc = FALSE; AsicSwitchChannel(pAd, pAd->StaCfg.wdev.CentralChannel, FALSE); AsicLockChannel(pAd, pAd->StaCfg.wdev.CentralChannel); bbp_set_bw(pAd, pAd->StaCfg.wdev.bw); } wdev->CentralChannel = 0; wdev->channel= 0; wdev->bw = HT_BW_20; wdev->extcha = EXTCHA_NONE; OPSTATUS_CLEAR_FLAG(pAd, fOP_AP_STATUS_MEDIA_STATE_CONNECTED); cfg80211_disconnected(dev_p, 0, NULL, 0, GFP_KERNEL); NdisZeroMemory(pAd->ApCfg.ApCliTab[MAIN_MBSSID].CfgApCliBssid, MAC_ADDR_LEN); RtmpOSNetDevDetach(dev_p); rtmp_wdev_idx_unreg(pAd, wdev); pAd->flg_apcli_init = FALSE; wdev->if_dev = NULL; } else /* Never Opened When New Netdevice on */ { RtmpOSNetDevDetach(dev_p); } if (dev_p->ieee80211_ptr) { kfree(dev_p->ieee80211_ptr); dev_p->ieee80211_ptr = NULL; } } }
VOID WpaMicFailureReportFrame( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { PUCHAR pOutBuffer = NULL; UCHAR Header802_3[14]; ULONG FrameLen = 0; UCHAR *mpool; PEAPOL_PACKET pPacket; UCHAR Mic[16]; BOOLEAN bUnicast; DBGPRINT(RT_DEBUG_TRACE, ("WpaMicFailureReportFrame ----->\n")); bUnicast = (Elem->Msg[0] == 1 ? TRUE:FALSE); pAd->Sequence = ((pAd->Sequence) + 1) & (MAX_SEQ_NUMBER); /* init 802.3 header and Fill Packet */ MAKE_802_3_HEADER(Header802_3, pAd->CommonCfg.Bssid, pAd->CurrentAddress, EAPOL); /* Allocate memory for output */ os_alloc_mem(NULL, (PUCHAR *)&mpool, TX_EAPOL_BUFFER); if (mpool == NULL) { DBGPRINT(RT_DEBUG_ERROR, ("!!!%s : no memory!!!\n", __FUNCTION__)); return; } pPacket = (PEAPOL_PACKET)mpool; NdisZeroMemory(pPacket, TX_EAPOL_BUFFER); pPacket->ProVer = EAPOL_VER; pPacket->ProType = EAPOLKey; pPacket->KeyDesc.Type = WPA1_KEY_DESC; /* Request field presented */ pPacket->KeyDesc.KeyInfo.Request = 1; if(pAd->StaCfg.WepStatus == Ndis802_11Encryption3Enabled) { pPacket->KeyDesc.KeyInfo.KeyDescVer = 2; } else /* TKIP */ { pPacket->KeyDesc.KeyInfo.KeyDescVer = 1; } pPacket->KeyDesc.KeyInfo.KeyType = (bUnicast ? PAIRWISEKEY : GROUPKEY); /* KeyMic field presented */ pPacket->KeyDesc.KeyInfo.KeyMic = 1; /* Error field presented */ pPacket->KeyDesc.KeyInfo.Error = 1; /* Update packet length after decide Key data payload */ SET_UINT16_TO_ARRARY(pPacket->Body_Len, MIN_LEN_OF_EAPOL_KEY_MSG) /* Key Replay Count */ NdisMoveMemory(pPacket->KeyDesc.ReplayCounter, pAd->StaCfg.ReplayCounter, LEN_KEY_DESC_REPLAY); inc_byte_array(pAd->StaCfg.ReplayCounter, 8); /* Convert to little-endian format. */ *((USHORT *)&pPacket->KeyDesc.KeyInfo) = cpu2le16(*((USHORT *)&pPacket->KeyDesc.KeyInfo)); MlmeAllocateMemory(pAd, (PUCHAR *)&pOutBuffer); /* allocate memory */ if(pOutBuffer == NULL) { os_free_mem(NULL, mpool); return; } /* Prepare EAPOL frame for MIC calculation Be careful, only EAPOL frame is counted for MIC calculation */ MakeOutgoingFrame(pOutBuffer, &FrameLen, CONV_ARRARY_TO_UINT16(pPacket->Body_Len) + 4, pPacket, END_OF_ARGS); /* Prepare and Fill MIC value */ NdisZeroMemory(Mic, sizeof(Mic)); if(pAd->StaCfg.WepStatus == Ndis802_11Encryption3Enabled) { /* AES */ UCHAR digest[20] = {0}; RT_HMAC_SHA1(pAd->StaCfg.PTK, LEN_PTK_KCK, pOutBuffer, FrameLen, digest, SHA1_DIGEST_SIZE); NdisMoveMemory(Mic, digest, LEN_KEY_DESC_MIC); } else { /* TKIP */ RT_HMAC_MD5(pAd->StaCfg.PTK, LEN_PTK_KCK, pOutBuffer, FrameLen, Mic, MD5_DIGEST_SIZE); } NdisMoveMemory(pPacket->KeyDesc.KeyMic, Mic, LEN_KEY_DESC_MIC); /* copy frame to Tx ring and send MIC failure report frame to authenticator */ RTMPToWirelessSta(pAd, &pAd->MacTab.Content[BSSID_WCID], Header802_3, LENGTH_802_3, (PUCHAR)pPacket, CONV_ARRARY_TO_UINT16(pPacket->Body_Len) + 4, FALSE); MlmeFreeMemory(pAd, (PUCHAR)pOutBuffer); os_free_mem(NULL, mpool); DBGPRINT(RT_DEBUG_TRACE, ("WpaMicFailureReportFrame <-----\n")); }
/* ======================================================================== Routine Description: Close raxx interface. Arguments: *net_dev the raxx interface pointer Return Value: 0 Open OK otherwise Open Fail Note: 1. if open fail, kernel will not call the close function. 2. Free memory for (1) Mlme Memory Handler: MlmeHalt() (2) TX & RX: RTMPFreeTxRxRingMemory() (3) BA Reordering: ba_reordering_resource_release() ======================================================================== */ int MainVirtualIF_close(IN struct net_device *net_dev) { struct rt_rtmp_adapter *pAd = NULL; GET_PAD_FROM_NET_DEV(pAd, net_dev); /* Sanity check for pAd */ if (pAd == NULL) return 0; /* close ok */ netif_carrier_off(pAd->net_dev); netif_stop_queue(pAd->net_dev); { BOOLEAN Cancelled; if (INFRA_ON(pAd) && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))) { struct rt_mlme_disassoc_req DisReq; struct rt_mlme_queue_elem *MsgElem = (struct rt_mlme_queue_elem *)kmalloc(sizeof(struct rt_mlme_queue_elem), MEM_ALLOC_FLAG); if (MsgElem) { COPY_MAC_ADDR(DisReq.Addr, pAd->CommonCfg.Bssid); DisReq.Reason = REASON_DEAUTH_STA_LEAVING; MsgElem->Machine = ASSOC_STATE_MACHINE; MsgElem->MsgType = MT2_MLME_DISASSOC_REQ; MsgElem->MsgLen = sizeof(struct rt_mlme_disassoc_req); NdisMoveMemory(MsgElem->Msg, &DisReq, sizeof (struct rt_mlme_disassoc_req)); /* Prevent to connect AP again in STAMlmePeriodicExec */ pAd->MlmeAux.AutoReconnectSsidLen = 32; NdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, pAd->MlmeAux. AutoReconnectSsidLen); pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_OID_DISASSOC; MlmeDisassocReqAction(pAd, MsgElem); kfree(MsgElem); } RTMPusecDelay(1000); } RTMPCancelTimer(&pAd->StaCfg.StaQuickResponeForRateUpTimer, &Cancelled); RTMPCancelTimer(&pAd->StaCfg.WpaDisassocAndBlockAssocTimer, &Cancelled); } VIRTUAL_IF_DOWN(pAd); RT_MOD_DEC_USE_COUNT(); return 0; /* close ok */ }
/* ========================================================================== Description: APCLI MLME JOIN req state machine procedure ========================================================================== */ static VOID ApCliCtrlJoinReqAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { APCLI_MLME_JOIN_REQ_STRUCT JoinReq; PAPCLI_STRUCT pApCliEntry; USHORT ifIndex = (USHORT)(Elem->Priv); PULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].CtrlCurrState; #ifdef WSC_AP_SUPPORT PWSC_CTRL pWpsCtrl = &pAd->ApCfg.ApCliTab[ifIndex].WscControl; #endif /* WSC_AP_SUPPORT */ DBGPRINT(RT_DEBUG_TRACE, ("(%s) Start Probe Req.\n", __FUNCTION__)); if (ifIndex >= MAX_APCLI_NUM) return; if (ApScanRunning(pAd) == TRUE) return; pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; NdisZeroMemory(&JoinReq, sizeof(APCLI_MLME_JOIN_REQ_STRUCT)); if (!MAC_ADDR_EQUAL(pApCliEntry->CfgApCliBssid, ZERO_MAC_ADDR)) { COPY_MAC_ADDR(JoinReq.Bssid, pApCliEntry->CfgApCliBssid); } #ifdef WSC_AP_SUPPORT if ((pWpsCtrl->WscConfMode != WSC_DISABLE) && (pWpsCtrl->bWscTrigger == TRUE)) { ULONG bss_idx = 0; NdisZeroMemory(JoinReq.Ssid, MAX_LEN_OF_SSID); JoinReq.SsidLen = pAd->ApCfg.ApCliTab[ifIndex].WscControl.WscSsid.SsidLength; NdisMoveMemory(JoinReq.Ssid, pAd->ApCfg.ApCliTab[ifIndex].WscControl.WscSsid.Ssid, JoinReq.SsidLen); if (pWpsCtrl->WscMode == 1) /* PIN */ { bss_idx = BssSsidTableSearchBySSID(&pAd->ScanTab, (PUCHAR)(JoinReq.Ssid), JoinReq.SsidLen); if (bss_idx == BSS_NOT_FOUND) { ApSiteSurvey(pAd, NULL, SCAN_WSC_ACTIVE, FALSE); return; } else { int old_conf_mode = pWpsCtrl->WscConfMode; ADD_HTINFO RootApHtInfo, ApHtInfo; UCHAR channel = pAd->CommonCfg.Channel, RootApChannel = pAd->ScanTab.BssEntry[bss_idx].Channel; UCHAR RootApCentralChannel = pAd->ScanTab.BssEntry[bss_idx].CentralChannel; ApHtInfo = pAd->CommonCfg.AddHTInfo.AddHtInfo; RootApHtInfo = pAd->ScanTab.BssEntry[bss_idx].AddHtInfo.AddHtInfo; if ((RootApChannel != channel) || ((RootApCentralChannel != RootApChannel) && (pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth == BW_40) && (ApHtInfo.ExtChanOffset != RootApHtInfo.ExtChanOffset))) { STRING ChStr[5] = {0}; if (pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth == BW_40) { if (RootApHtInfo.ExtChanOffset == EXTCHA_ABOVE) Set_HtExtcha_Proc(pAd, "1"); else Set_HtExtcha_Proc(pAd, "0"); } snprintf(ChStr, sizeof(ChStr), "%d", pAd->ScanTab.BssEntry[bss_idx].Channel); Set_Channel_Proc(pAd, ChStr); /* ApStop will call WscStop, we need to reset WscConfMode, WscMode & bWscTrigger here. */ pWpsCtrl->WscState = WSC_STATE_START; pWpsCtrl->WscStatus = STATUS_WSC_START_ASSOC; pWpsCtrl->WscMode = 1; pWpsCtrl->WscConfMode = old_conf_mode; pWpsCtrl->bWscTrigger = TRUE; return; } } } } else #endif /* WSC_AP_SUPPORT */ if (pApCliEntry->CfgSsidLen != 0) { JoinReq.SsidLen = pApCliEntry->CfgSsidLen; NdisMoveMemory(&(JoinReq.Ssid), pApCliEntry->CfgSsid, JoinReq.SsidLen); } DBGPRINT(RT_DEBUG_TRACE, ("(%s) Probe Ssid=%s, Bssid=%02x:%02x:%02x:%02x:%02x:%02x\n", __FUNCTION__, JoinReq.Ssid, JoinReq.Bssid[0], JoinReq.Bssid[1], JoinReq.Bssid[2], JoinReq.Bssid[3], JoinReq.Bssid[4], JoinReq.Bssid[5])); *pCurrState = APCLI_CTRL_PROBE; MlmeEnqueue(pAd, APCLI_SYNC_STATE_MACHINE, APCLI_MT2_MLME_PROBE_REQ, sizeof(APCLI_MLME_JOIN_REQ_STRUCT), &JoinReq, ifIndex); return; }
NDIS_STATUS PtRegisterDevice( VOID ) /*++ Routine Description: Register an ioctl interface - a device object to be used for this purpose is created by NDIS when we call NdisMRegisterDevice. This routine is called whenever a new miniport instance is initialized. However, we only create one global device object, when the first miniport instance is initialized. This routine handles potential race conditions with PtDeregisterDevice via the ControlDeviceMutex. NOTE: do not call this from DriverEntry; it will prevent the driver from being unloaded (e.g. on uninstall). Arguments: None Return Value: NDIS_STATUS_SUCCESS if we successfully register a device object. --*/ { NDIS_STATUS Status = NDIS_STATUS_SUCCESS; UNICODE_STRING DeviceName; UNICODE_STRING DeviceLinkUnicodeString; NDIS_DEVICE_OBJECT_ATTRIBUTES DeviceObjectAttributes; PDRIVER_DISPATCH DispatchTable[IRP_MJ_MAXIMUM_FUNCTION+1]; DBGPRINT(MUX_LOUD, ("==>PtRegisterDevice\n")); MUX_ACQUIRE_MUTEX(&ControlDeviceMutex); ++MiniportCount; if (1 == MiniportCount) { NdisZeroMemory(DispatchTable, (IRP_MJ_MAXIMUM_FUNCTION+1) * sizeof(PDRIVER_DISPATCH)); DispatchTable[IRP_MJ_CREATE] = PtDispatch; DispatchTable[IRP_MJ_CLEANUP] = PtDispatch; DispatchTable[IRP_MJ_CLOSE] = PtDispatch; DispatchTable[IRP_MJ_DEVICE_CONTROL] = PtDispatch; NdisInitUnicodeString(&DeviceName, NTDEVICE_STRING); NdisInitUnicodeString(&DeviceLinkUnicodeString, GLOBAL_LINKNAME_STRING); NdisZeroMemory(&DeviceObjectAttributes, sizeof(NDIS_DEVICE_OBJECT_ATTRIBUTES)); DeviceObjectAttributes.Header.Type = NDIS_OBJECT_TYPE_DEFAULT; // type implicit from the context DeviceObjectAttributes.Header.Revision = NDIS_DEVICE_OBJECT_ATTRIBUTES_REVISION_1; DeviceObjectAttributes.Header.Size = sizeof(NDIS_DEVICE_OBJECT_ATTRIBUTES); DeviceObjectAttributes.DeviceName = &DeviceName; DeviceObjectAttributes.SymbolicName = &DeviceLinkUnicodeString; DeviceObjectAttributes.MajorFunctions = &DispatchTable[0]; DeviceObjectAttributes.ExtensionSize = 0; DeviceObjectAttributes.DefaultSDDLString = NULL; DeviceObjectAttributes.DeviceClassGuid = 0; Status = NdisRegisterDeviceEx( DriverHandle, &DeviceObjectAttributes, &ControlDeviceObject, &NdisDeviceHandle); } MUX_RELEASE_MUTEX(&ControlDeviceMutex); DBGPRINT(MUX_INFO, ("<==PtRegisterDevice: %x\n", Status)); return (Status); }
/* ========================================================================== Description: mlme assoc req handling procedure Parameters: Adapter - Adapter pointer Elem - MLME Queue Element Pre: the station has been authenticated and the following information is stored in the config -# SSID -# supported rates and their length -# listen interval (Adapter->PortCfg.default_listen_count) -# Transmit power (Adapter->PortCfg.tx_power) Post : -# An association request frame is generated and sent to the air -# Association timer starts -# Association state -> ASSOC_WAIT_RSP ========================================================================== */ static VOID ApCliMlmeAssocReqAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { NDIS_STATUS NStatus; BOOLEAN Cancelled; UCHAR ApAddr[6]; HEADER_802_11 AssocHdr; UCHAR WmeIe[9] = {IE_VENDOR_SPECIFIC, 0x07, 0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00}; USHORT ListenIntv; ULONG Timeout; USHORT CapabilityInfo; PUCHAR pOutBuffer = NULL; ULONG FrameLen = 0; ULONG tmp; UCHAR SsidIe = IE_SSID; UCHAR SupRateIe = IE_SUPP_RATES; UCHAR ExtRateIe = IE_EXT_SUPP_RATES; APCLI_CTRL_MSG_STRUCT ApCliCtrlMsg; USHORT ifIndex = (USHORT)(Elem->Priv); PULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].AssocCurrState; if (ifIndex >= MAX_APCLI_NUM) return; /* Block all authentication request durning WPA block period */ if (pAd->ApCfg.ApCliTab[ifIndex].bBlockAssoc == TRUE) { DBGPRINT(RT_DEBUG_TRACE, ("APCLI_ASSOC - Block Auth request durning WPA block period!\n")); *pCurrState = APCLI_ASSOC_IDLE; ApCliCtrlMsg.Status = MLME_STATE_MACHINE_REJECT; MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_ASSOC_RSP, sizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex); } else if(MlmeAssocReqSanity(pAd, Elem->Msg, Elem->MsgLen, ApAddr, &CapabilityInfo, &Timeout, &ListenIntv)) { RTMPCancelTimer(&pAd->ApCliMlmeAux.ApCliAssocTimer, &Cancelled); /* allocate and send out AssocRsp frame */ NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory */ if (NStatus != NDIS_STATUS_SUCCESS) { DBGPRINT(RT_DEBUG_TRACE, ("APCLI_ASSOC - ApCliMlmeAssocReqAction() allocate memory failed \n")); *pCurrState = APCLI_ASSOC_IDLE; ApCliCtrlMsg.Status = MLME_FAIL_NO_RESOURCE; MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_ASSOC_RSP, sizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex); return; } DBGPRINT(RT_DEBUG_TRACE, ("APCLI_ASSOC - Send ASSOC request...\n")); ApCliMgtMacHeaderInit(pAd, &AssocHdr, SUBTYPE_ASSOC_REQ, 0, ApAddr, ApAddr, ifIndex); /* Build basic frame first */ MakeOutgoingFrame(pOutBuffer, &FrameLen, sizeof(HEADER_802_11), &AssocHdr, 2, &CapabilityInfo, 2, &ListenIntv, 1, &SsidIe, 1, &pAd->ApCliMlmeAux.SsidLen, pAd->ApCliMlmeAux.SsidLen, pAd->ApCliMlmeAux.Ssid, 1, &SupRateIe, 1, &pAd->ApCliMlmeAux.SupRateLen, pAd->ApCliMlmeAux.SupRateLen, pAd->ApCliMlmeAux.SupRate, END_OF_ARGS); if(pAd->ApCliMlmeAux.ExtRateLen != 0) { MakeOutgoingFrame(pOutBuffer + FrameLen, &tmp, 1, &ExtRateIe, 1, &pAd->ApCliMlmeAux.ExtRateLen, pAd->ApCliMlmeAux.ExtRateLen, pAd->ApCliMlmeAux.ExtRate, END_OF_ARGS); FrameLen += tmp; } #ifdef DOT11_N_SUPPORT /* HT */ if ((pAd->ApCliMlmeAux.HtCapabilityLen > 0) && WMODE_CAP_N(pAd->CommonCfg.PhyMode)) { ULONG TmpLen; //UCHAR HtLen; */ //UCHAR BROADCOM[4] = {0x0, 0x90, 0x4c, 0x33}; */ /* 2008/12/17:KH modified to fix the low throughput of AP-Client on Big-Endian Platform<-- */ #ifdef RT_BIG_ENDIAN HT_CAPABILITY_IE HtCapabilityTmp; #endif #ifndef RT_BIG_ENDIAN { MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, 1, &HtCapIe, 1, &pAd->ApCliMlmeAux.HtCapabilityLen, pAd->ApCliMlmeAux.HtCapabilityLen, &pAd->ApCliMlmeAux.HtCapability, END_OF_ARGS); } #else NdisZeroMemory(&HtCapabilityTmp, sizeof(HT_CAPABILITY_IE)); NdisMoveMemory(&HtCapabilityTmp, &pAd->ApCliMlmeAux.HtCapability, pAd->ApCliMlmeAux.HtCapabilityLen); *(USHORT *)(&HtCapabilityTmp.HtCapInfo) = SWAP16(*(USHORT *)(&HtCapabilityTmp.HtCapInfo)); *(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo) = SWAP16(*(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo)); MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, 1, &HtCapIe, 1, &pAd->ApCliMlmeAux.HtCapabilityLen, pAd->ApCliMlmeAux.HtCapabilityLen,&HtCapabilityTmp, END_OF_ARGS); #endif /* 2008/12/17:KH modified to fix the low throughput of AP-Client on Big-Endian Platform--> */ FrameLen += TmpLen; } #endif /* DOT11_N_SUPPORT */ #ifdef AGGREGATION_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) { #ifdef PIGGYBACK_SUPPORT if ((pAd->CommonCfg.bPiggyBackCapable) && ((pAd->ApCliMlmeAux.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 #endif /* PIGGYBACK_SUPPORT */ if (pAd->ApCliMlmeAux.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, 0x06, 0x00, 0x00, 0x00}; MakeOutgoingFrame(pOutBuffer+FrameLen, &TmpLen, 9, RalinkIe, END_OF_ARGS); FrameLen += TmpLen; } #endif /* AGGREGATION_SUPPORT */ if (pAd->ApCliMlmeAux.APEdcaParm.bValid) { if (pAd->ApCfg.ApCliTab[0].UapsdInfo.bAPSDCapable && pAd->ApCliMlmeAux.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; } /* Append RSN_IE when WPAPSK OR WPA2PSK, */ if (((pAd->ApCfg.ApCliTab[ifIndex].AuthMode == Ndis802_11AuthModeWPAPSK) || (pAd->ApCfg.ApCliTab[ifIndex].AuthMode == Ndis802_11AuthModeWPA2PSK)) #ifdef WSC_AP_SUPPORT && (pAd->ApCfg.ApCliTab[ifIndex].WscControl.WscConfMode == WSC_DISABLE) #endif /* WSC_AP_SUPPORT */ ) { UCHAR RSNIe = IE_WPA; if (pAd->ApCfg.ApCliTab[ifIndex].AuthMode == Ndis802_11AuthModeWPA2PSK) RSNIe = IE_WPA2; MakeOutgoingFrame(pOutBuffer + FrameLen, &tmp, 1, &RSNIe, 1, &pAd->ApCfg.ApCliTab[ifIndex].RSNIE_Len, pAd->ApCfg.ApCliTab[ifIndex].RSNIE_Len, pAd->ApCfg.ApCliTab[ifIndex].RSN_IE, END_OF_ARGS); FrameLen += tmp; } #ifdef WSC_AP_SUPPORT if (pAd->ApCfg.ApCliTab[ifIndex].WscControl.WscConfMode != WSC_DISABLE) { UCHAR *pWscBuf = NULL, WscIeLen = 0; ULONG WscTmpLen = 0; os_alloc_mem(pAd, (UCHAR **) &pWscBuf, 512); if (pWscBuf != NULL) { NdisZeroMemory(pWscBuf, 512); WscBuildAssocReqIE(&pAd->ApCfg.ApCliTab[ifIndex].WscControl, pWscBuf, &WscIeLen); MakeOutgoingFrame(pOutBuffer + FrameLen, &WscTmpLen, WscIeLen, pWscBuf, END_OF_ARGS); FrameLen += WscTmpLen; os_free_mem(NULL, pWscBuf); } else DBGPRINT(RT_DEBUG_WARN,("%s:: WscBuf Allocate failed!\n", __FUNCTION__)); } #endif /* WSC_AP_SUPPORT */ #ifdef P2P_SUPPORT if (P2P_CLI_ON(pAd)) { ULONG TmpLen; PUCHAR pData; pData = pOutBuffer + FrameLen; P2pMakeP2pIE(pAd, SUBTYPE_ASSOC_REQ, pData, &TmpLen); FrameLen += TmpLen; DBGPRINT(RT_DEBUG_TRACE, ("ASSOC RSP - Insert P2P IE \n")); } #endif /* P2P_SUPPORT */ MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen); MlmeFreeMemory(pAd, pOutBuffer); RTMPSetTimer(&pAd->ApCliMlmeAux.ApCliAssocTimer, Timeout); *pCurrState = APCLI_ASSOC_WAIT_RSP; } else { DBGPRINT(RT_DEBUG_TRACE, ("APCLI_ASSOC - ApCliMlmeAssocReqAction() sanity check failed. BUG!!!!!! \n")); *pCurrState = APCLI_ASSOC_IDLE; ApCliCtrlMsg.Status = MLME_INVALID_FORMAT; MlmeEnqueue(pAd, APCLI_CTRL_STATE_MACHINE, APCLI_CTRL_ASSOC_RSP, sizeof(APCLI_CTRL_MSG_STRUCT), &ApCliCtrlMsg, ifIndex); } return; }
/* ========================================================================== Description: MLME PROBE req state machine procedure ========================================================================== */ static VOID ApCliMlmeProbeReqAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { BOOLEAN Cancelled; APCLI_MLME_JOIN_REQ_STRUCT *Info = (APCLI_MLME_JOIN_REQ_STRUCT *)(Elem->Msg); USHORT ifIndex = (USHORT)(Elem->Priv); PULONG pCurrState = &pAd->ApCfg.ApCliTab[ifIndex].SyncCurrState; APCLI_STRUCT *pApCliEntry = NULL; MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("ApCli SYNC - ApCliMlmeProbeReqAction(Ssid %s)\n", Info->Ssid)); if (ifIndex >= MAX_APCLI_NUM) return; pApCliEntry = &pAd->ApCfg.ApCliTab[ifIndex]; /* reset all the timers */ RTMPCancelTimer(&(pApCliEntry->MlmeAux.ProbeTimer), &Cancelled); pApCliEntry->MlmeAux.Rssi = -9999; #ifdef RT_CFG80211_P2P_CONCURRENT_DEVICE //Get Channel from ScanTable pApCliEntry->MlmeAux.SupRateLen = pAd->cfg80211_ctrl.P2pSupRateLen; NdisMoveMemory(pApCliEntry->MlmeAux.SupRate, pAd->cfg80211_ctrl.P2pSupRate, pAd->cfg80211_ctrl.P2pSupRateLen); pApCliEntry->MlmeAux.ExtRateLen = pAd->cfg80211_ctrl.P2pExtRateLen; NdisMoveMemory(pApCliEntry->MlmeAux.ExtRate, pAd->cfg80211_ctrl.P2pExtRate, pAd->cfg80211_ctrl.P2pExtRateLen); #else #ifdef APCLI_CONNECTION_TRIAL if (pApCliEntry->TrialCh ==0) pApCliEntry->MlmeAux.Channel = pAd->CommonCfg.Channel; else pApCliEntry->MlmeAux.Channel = pApCliEntry->TrialCh; #else pApCliEntry->MlmeAux.Channel = pAd->CommonCfg.Channel; #endif /* APCLI_CONNECTION_TRIAL */ pApCliEntry->MlmeAux.SupRateLen = pAd->CommonCfg.SupRateLen; NdisMoveMemory(pApCliEntry->MlmeAux.SupRate, pAd->CommonCfg.SupRate, pAd->CommonCfg.SupRateLen); /* Prepare the default value for extended rate */ pApCliEntry->MlmeAux.ExtRateLen = pAd->CommonCfg.ExtRateLen; NdisMoveMemory(pApCliEntry->MlmeAux.ExtRate, pAd->CommonCfg.ExtRate, pAd->CommonCfg.ExtRateLen); #endif /* RT_CFG80211_P2P_CONCURRENT_DEVICE */ RTMPSetTimer(&(pApCliEntry->MlmeAux.ProbeTimer), PROBE_TIMEOUT); #ifdef APCLI_CONNECTION_TRIAL NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Bssid, MAC_ADDR_LEN); NdisZeroMemory(pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Ssid, MAX_LEN_OF_SSID); NdisCopyMemory(pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Bssid, pAd->ApCfg.ApCliTab[ifIndex].CfgApCliBssid, MAC_ADDR_LEN); NdisCopyMemory(pAd->ApCfg.ApCliTab[ifIndex].MlmeAux.Ssid, pAd->ApCfg.ApCliTab[ifIndex].CfgSsid, pAd->ApCfg.ApCliTab[ifIndex].CfgSsidLen); #endif /* APCLI_CONNECTION_TRIAL */ ApCliEnqueueProbeRequest(pAd, Info->SsidLen, (PCHAR) Info->Ssid, ifIndex); MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("ApCli SYNC - Start Probe the SSID %s on channel =%d\n", pApCliEntry->MlmeAux.Ssid, pApCliEntry->MlmeAux.Channel)); *pCurrState = APCLI_JOIN_WAIT_PROBE_RSP; return; }