diff options
| author | karlf <[email protected]> | 2016-08-11 13:28:13 -0700 |
|---|---|---|
| committer | karlf <[email protected]> | 2016-08-11 13:28:13 -0700 |
| commit | 96eb96dfb613e4c745db6bd1f53a92fe7e2290fc (patch) | |
| tree | ad5f3ede5cbcd6b598677ce41bcf8318471bdd92 /network/wlan/WDI/COMMON/MgntConstructPacket.c | |
| parent | 687b274aa38fd05c8c26e3068932121876d7f745 (diff) | |
Updated for "Windows 10 Anniversary Update" (Version 1607)
Diffstat (limited to 'network/wlan/WDI/COMMON/MgntConstructPacket.c')
| -rw-r--r-- | network/wlan/WDI/COMMON/MgntConstructPacket.c | 4096 |
1 files changed, 0 insertions, 4096 deletions
diff --git a/network/wlan/WDI/COMMON/MgntConstructPacket.c b/network/wlan/WDI/COMMON/MgntConstructPacket.c deleted file mode 100644 index 34576a46..00000000 --- a/network/wlan/WDI/COMMON/MgntConstructPacket.c +++ /dev/null @@ -1,4096 +0,0 @@ -#include "Mp_Precomp.h" - -#if WPP_SOFTWARE_TRACE -#include "MgntConstructPacket.tmh" -#endif - -static u1Byte BroadcastAddress[6]={0xff,0xff,0xff,0xff,0xff,0xff}; - -VOID -AppendQoSElement( - OUT POCTET_STRING packet, - IN POCTET_STRING element, - IN u1Byte OUI_Subtype - ) -{ - u1Byte szQoSOUI[] ={221, 0, 0x00, 0x50, 0xf2, OUI_SUB_WMM, 0, 1}; - OCTET_STRING tmp; - - if (OUI_Subtype == OUI_SUBTYPE_QOS_CAPABI) - { - szQoSOUI[0] = 46; - szQoSOUI[1] = (u1Byte)element->Length; - FillOctetString(tmp, szQoSOUI, 2); - PacketAppendData(packet, tmp); - } - else - { - szQoSOUI[1] = element->Length + 6; - szQoSOUI[6] = OUI_Subtype; - FillOctetString(tmp, szQoSOUI, 8); - PacketAppendData(packet, tmp); - } - - // QoS Capability IE - PacketAppendData(packet, *element); -} - - -VOID -SelectSupportedRatesElement( - IN WIRELESS_MODE wirelessmode, - IN OCTET_STRING SuppRates, - IN BOOLEAN bFilterCck, - OUT POCTET_STRING pSuppRates, - OUT POCTET_STRING pExtSuppRates -) -{ - OCTET_STRING FilteredSuppRates; - u1Byte FilteredSuppRatesBuf[MAX_NUM_RATES]; - - FilteredSuppRates.Length = 0; - FilteredSuppRates.Octet = FilteredSuppRatesBuf; - - if(bFilterCck) - { - u2Byte i = 0; - - for(i = 0; i < SuppRates.Length; i++) - { - if(IS_CCK_RATE((SuppRates.Octet[i] & 0x7F))) - { - continue; - } - else - { - FilteredSuppRates.Octet[FilteredSuppRates.Length] = SuppRates.Octet[i]; - FilteredSuppRates.Length++; - } - } - } - else - { - PlatformMoveMemory(FilteredSuppRates.Octet, SuppRates.Octet, SuppRates.Length); - FilteredSuppRates.Length = SuppRates.Length; - } - - pSuppRates->Length = 0; - pExtSuppRates->Length = 0; - -#if 1 - if(wirelessmode & (WIRELESS_MODE_A|WIRELESS_MODE_B|WIRELESS_MODE_N_5G|WIRELESS_MODE_AC_5G)) - { - u2Byte cbCopied = ((FilteredSuppRates.Length <= 8) ? FilteredSuppRates.Length : 8); - - // NOTE! Length of Support Rates <= 8. - CopyMem( pSuppRates->Octet, FilteredSuppRates.Octet, cbCopied ); - pSuppRates->Length = cbCopied; - } - else if(wirelessmode & (WIRELESS_MODE_G|WIRELESS_MODE_N_24G|WIRELESS_MODE_AC_24G)) - { - u4Byte i; - - for(i = 0; i < FilteredSuppRates.Length; i++) - { - // There are only 4 rates in WIRELESS_MODE_B, just put them into SuppRateIE first. - // Always put B mode rate in SuppRateIE. - if(MgntIsRateValidForWirelessMode((FilteredSuppRates.Octet[i] & 0x7F), WIRELESS_MODE_B)) - { - pSuppRates->Octet[pSuppRates->Length] = FilteredSuppRates.Octet[i]; - pSuppRates->Length++; - } - // Put other rates to ExtSuppRatesIE first. (Also check if ExtSuppRatesIE length longer than 255.) - else if(pExtSuppRates->Length < 255) - { - pExtSuppRates->Octet[pExtSuppRates->Length] = FilteredSuppRates.Octet[i]; - pExtSuppRates->Length++; - } - else - { - RT_TRACE(COMP_MLME, DBG_WARNING, ("SelectSupportedRatesElement(): ExtSuppRatesIE length larger than 255. \n")); - } - } - - // pSuppRates->Length must less than 4 at this point. - if((pSuppRates->Length + pExtSuppRates->Length) <= MAX_SUP_RATE_LEN) - { - CopyMem( pSuppRates->Octet+pSuppRates->Length, pExtSuppRates->Octet, pExtSuppRates->Length); - pSuppRates->Length = pSuppRates->Length + pExtSuppRates->Length; - pExtSuppRates->Length = 0; - } - else - { - u1Byte SupRateAddLen = 0, NewLen_ExtSupRate = 0; - u1Byte TmpRateBuffer[256] = {0}; - - SupRateAddLen = MAX_SUP_RATE_LEN - pSuppRates->Length; - NewLen_ExtSupRate = pExtSuppRates->Length - SupRateAddLen; - - CopyMem( pSuppRates->Octet+pSuppRates->Length, pExtSuppRates->Octet, SupRateAddLen); - pSuppRates->Length = MAX_SUP_RATE_LEN; - - CopyMem( TmpRateBuffer, pExtSuppRates->Octet+SupRateAddLen, NewLen_ExtSupRate); - CopyMem(pExtSuppRates->Octet, TmpRateBuffer, NewLen_ExtSupRate); - pExtSuppRates->Length = NewLen_ExtSupRate; - } - - RT_PRINT_DATA(COMP_SEC, DBG_TRACE, "pSuppRates", pSuppRates->Octet, pSuppRates->Length); - RT_PRINT_DATA(COMP_SEC, DBG_TRACE, "pExtSuppRates", pExtSuppRates->Octet, pExtSuppRates->Length); - } - else - { - RT_ASSERT(FALSE, ("SelectSupportedRatesElement(): Unknown wirelessmode: 0x%x\n", wirelessmode)); - } -#else - switch( wirelessmode ) - { - case WIRELESS_MODE_A: - case WIRELESS_MODE_B: - case WIRELESS_MODE_N_5G: //Added by Emily 2006.11.10 - case WIRELESS_MODE_AC_5G: - { - u2Byte cbCopied = ((FilteredSuppRates.Length <= 8) ? FilteredSuppRates.Length : 8); - - // NOTE! Length of Support Rates <= 8. - CopyMem( pSuppRates->Octet, FilteredSuppRates.Octet, cbCopied ); - pSuppRates->Length = cbCopied; - } - break; - - case WIRELESS_MODE_G: - case WIRELESS_MODE_N_24G: //Added by Emily 2006.11.10 - case WIRELESS_MODE_AC_24G: - { - u4Byte i; - - for(i = 0; i < FilteredSuppRates.Length; i++) - { - // There are only 4 rates in WIRELESS_MODE_B, just put them into SuppRateIE first. - // Always put B mode rate in SuppRateIE. - if(MgntIsRateValidForWirelessMode((FilteredSuppRates.Octet[i] & 0x7F), WIRELESS_MODE_B)) - { - pSuppRates->Octet[pSuppRates->Length] = FilteredSuppRates.Octet[i]; - pSuppRates->Length++; - } - // Put other rates to ExtSuppRatesIE first. (Also check if ExtSuppRatesIE length longer than 255.) - else if(pExtSuppRates->Length < 255) - { - pExtSuppRates->Octet[pExtSuppRates->Length] = FilteredSuppRates.Octet[i]; - pExtSuppRates->Length++; - } - else - { - RT_TRACE(COMP_MLME, DBG_WARNING, ("SelectSupportedRatesElement(): ExtSuppRatesIE length larger than 255. \n")); - } - } - - // pSuppRates->Length must less than 4 at this point. - if((pSuppRates->Length + pExtSuppRates->Length) <= MAX_SUP_RATE_LEN) - { - CopyMem( pSuppRates->Octet+pSuppRates->Length, pExtSuppRates->Octet, pExtSuppRates->Length); - pSuppRates->Length = pSuppRates->Length + pExtSuppRates->Length; - pExtSuppRates->Length = 0; - } - else - { - u1Byte SupRateAddLen = 0, NewLen_ExtSupRate = 0; - u1Byte TmpRateBuffer[256] = {0}; - - SupRateAddLen = MAX_SUP_RATE_LEN - pSuppRates->Length; - NewLen_ExtSupRate = pExtSuppRates->Length - SupRateAddLen; - - CopyMem( pSuppRates->Octet+pSuppRates->Length, pExtSuppRates->Octet, SupRateAddLen); - pSuppRates->Length = MAX_SUP_RATE_LEN; - - CopyMem( TmpRateBuffer, pExtSuppRates->Octet+SupRateAddLen, NewLen_ExtSupRate); - CopyMem(pExtSuppRates->Octet, TmpRateBuffer, NewLen_ExtSupRate); - pExtSuppRates->Length = NewLen_ExtSupRate; - } - - RT_PRINT_DATA(COMP_SEC, DBG_TRACE, "pSuppRates", pSuppRates->Octet, pSuppRates->Length); - RT_PRINT_DATA(COMP_SEC, DBG_TRACE, "pExtSuppRates", pExtSuppRates->Octet, pExtSuppRates->Length); - } - break; - - // Note: HT rate is filled in HTCapability Information Element, so the supported MCS rate is not initialized here - default: - RT_ASSERT(FALSE, ("SelectSupportedRatesElement(): Unknown wirelessmode: 0x%x\n", wirelessmode)); - break; - } -#endif -} - - - -/* - * According to experiment, Realtek AP to STA (based on rtl8190) may achieve best performance - * if both STA and AP set limitation of aggregation size to 32K, that is, set AMPDU density to 2 - * (Ref: IEEE 11n specification). However, if Realtek STA associates to other AP, STA should set - * limitation of aggregation size to 8K, otherwise, performance of traffic stream from STA to AP - * will be much less than the traffic stream from AP to STA if both of the stream runs concurrently - * at the same time. - * - * Frame Format - * Element ID Length OUI Type1 Reserved - * 1 byte 1 byte 3 bytes 1 byte 1 byte - * - * OUI = 0x00, 0xe0, 0x4c, - * Type = 0x02 - * Reserved = 0x00 - * - * 2007.8.21 by Emily -*/ -VOID -ConstructRTKAggElement( - PADAPTER Adapter, - POCTET_STRING posRTKAggIE -) -{ - BOOLEAN bSupportRemoteWakeUp; - PlatformZeroMemory(posRTKAggIE->Octet, 7); - - posRTKAggIE->Octet[0] = 0x00; - posRTKAggIE->Octet[1] = 0xe0; - posRTKAggIE->Octet[2] = 0x4c; - posRTKAggIE->Octet[3] = 0x02; - posRTKAggIE->Octet[4] = 0x02; - - if(ACTING_AS_AP(Adapter)) - posRTKAggIE->Octet[5] |= RT_HT_CAP_USE_SOFTAP; - - if(IS_VENDOR_8812A_C_CUT(Adapter)) - posRTKAggIE->Octet[6] |= RT_HT_CAP_USE_JAGUAR_CCUT; - - Adapter->HalFunc.GetHalDefVarHandler(Adapter, HAL_DEF_WOWLAN , &bSupportRemoteWakeUp); - - if(bSupportRemoteWakeUp) - posRTKAggIE->Octet[5] |=RT_HT_CAP_USE_WOW; - - posRTKAggIE->Length = 7; -} - - - -VOID -ConstructBeaconFrame( - PADAPTER Adapter - ) -{ - PMGNT_INFO pMgntInfo = &Adapter->MgntInfo; - OCTET_STRING DSParms; - OCTET_STRING IBSSParms; - u8Byte TimeStamp; - pu1Byte pbcn; - OCTET_STRING SuppRates; - u1Byte SuppRatesContent[8]; // NOTE! Length of Support Rates <= 8. - OCTET_STRING ExtSuppRates; - u1Byte ExtSuppRatesContent[255]; // NOTE! Length of Extended Support Rates <= 255. - OCTET_STRING ERPInfo; - u1Byte ERPInfoContent[1]; - OCTET_STRING osEDCAInfoElem; - u1Byte EDCAInfo[1]; - OCTET_STRING IbssAdditionalIEs; - BOOLEAN bFilterCck = FALSE; - - pbcn = pMgntInfo->beaconframe.Octet; - - //------------------------------------------------------------------------- - // MAC Header. - //------------------------------------------------------------------------- - // Frame Control. - SET_80211_HDR_FRAME_CONTROL(pbcn, 0); - SET_80211_HDR_TYPE_AND_SUBTYPE(pbcn, Type_Beacon); - - // Duration. - SET_80211_HDR_DURATION(pbcn, 0); - - // Addresses (DA/SA/BSSID). - SET_80211_HDR_ADDRESS1(pbcn, BroadcastAddress); - SET_80211_HDR_ADDRESS2(pbcn, Adapter->CurrentAddress); - SET_80211_HDR_ADDRESS3(pbcn, Adapter->MgntInfo.Bssid); - - // - // Sequence Control. - // - // TODO: - // 1. If the beacon is send by TransmitTcb, Seq shall be 0, otherwise, we shall fill it with - // proper value. - // 2. We shall fix SendBeaconFrame to allow PCI use TransmitTCB to send beacon. - // - - SET_80211_HDR_FRAGMENT_SEQUENCE(pbcn, 0); - - //------------------------------------------------------------------------- - // Frame Body. - //------------------------------------------------------------------------- - // Timestamp. - -// [87B WiFi Ad-Hoc issue] Added by Annie, 2006-06-07. -// 1. TSF field will be updated by HW beacon. -// 2. On purpose set 0 for SW beacon is used. It can prevent other STA to update this value. It's a workaround for WiFi test. - TimeStamp = 0; - SET_BEACON_PROBE_RSP_TIME_STAMP_LOW(pbcn, (u4Byte)(TimeStamp&0xffffffff)); - SET_BEACON_PROBE_RSP_TIME_STAMP_HIGH(pbcn, (u4Byte)(TimeStamp >> 32)); -//--- - - // Beacon interval. - SET_BEACON_PROBE_RSP_BEACON_INTERVAL(pbcn, pMgntInfo->dot11BeaconPeriod); - - // Capability information. - if( ACTING_AS_AP(Adapter) ) - { - SET_BEACON_PROBE_RSP_CAPABILITY_INFO(pbcn, (pMgntInfo->mCap & ~cIBSS) ); - } - else - { - SET_BEACON_PROBE_RSP_CAPABILITY_INFO(pbcn, (pMgntInfo->mCap & ~cESS) ); - } - - if( pMgntInfo->SecurityInfo.PairwiseEncAlgorithm!= RT_ENC_ALG_NO_CIPHER ) - { - UNION_BEACON_PROBE_RSP_CAPABILITY_INFO(pbcn, cPrivacy); - } - else - { - MASK_BEACON_PROBE_RSP_CAPABILITY_INFO(pbcn, cPrivacy); - } - - // Size of this Frame until last fixed size field. - pMgntInfo->beaconframe.Length = 36; - - // SSID. - if( !ACTING_AS_AP(Adapter) || !pMgntInfo->bHiddenSSID ) - { - PacketMakeElement(&pMgntInfo->beaconframe, EID_SsId, Adapter->MgntInfo.Ssid); - } - else - { // AP mode Hidden SSID. Added by Annie, 2006-02-15. - u1Byte NullSSID[1]; - OCTET_STRING HiddenSSID; - FillOctetString(HiddenSSID, NullSSID, 0); - PacketMakeElement(&pMgntInfo->beaconframe, EID_SsId, HiddenSSID); - } - - // Supported rate. - FillOctetString(SuppRates, SuppRatesContent, 0); - FillOctetString(ExtSuppRates, ExtSuppRatesContent, 0); - // Set supported and extended supported rate according to Wirelessmode and dot11OperationalRateSet. - - P2P_FilerCck(Adapter, &bFilterCck); - - SelectSupportedRatesElement( pMgntInfo->dot11CurrentWirelessMode, pMgntInfo->dot11OperationalRateSet, bFilterCck,&SuppRates, &ExtSuppRates ); - - PacketMakeElement(&pMgntInfo->beaconframe, EID_SupRates, SuppRates); - - // DS parameters element. - // Note: - // We should have changed the dot11CurrentChannelNumber before constructing beacon frame no matter when the media is connected. - DSParms.Octet = &pMgntInfo->dot11CurrentChannelNumber; - DSParms.Length = 1; - PacketMakeElement(&pMgntInfo->beaconframe, EID_DSParms, DSParms); - RT_TRACE(COMP_AP, DBG_TRACE, ("Constructure Beacon Mediaconnect %d dot11CurrentChannel %d dot11CurrentWirelessMode=%x\n", - pMgntInfo->bMediaConnect,pMgntInfo->dot11CurrentChannelNumber, pMgntInfo->dot11CurrentWirelessMode)); - - // For debugging channel - // RT_TRACE_F(COMP_P2P | COMP_MLME, DBG_LOUD, ("Channel Register: %x\n" , PHY_QueryRFReg(GetDefaultAdapter(Adapter), 0, RF_CHNLBW, bMaskDWord))); - - // Ibss or TIM element - if( !ACTING_AS_AP(Adapter)) - { - IBSSParms.Octet = (pu1Byte)(&pMgntInfo->mIbssParms.atimWin); - IBSSParms.Length = 2; - PacketMakeElement(&pMgntInfo->beaconframe, EID_IbssParms, IBSSParms); - } - else - { - // Update DTIM Count. - if(pMgntInfo->mDtimCount == 0) - pMgntInfo->mDtimCount = pMgntInfo->dot11DtimPeriod - 1; - else - pMgntInfo->mDtimCount--; - - AP_PS_FillTim(pMgntInfo); - - PacketMakeElement(&pMgntInfo->beaconframe, EID_Tim, pMgntInfo->Tim); - } - - DFS_ApConstructBeaconIEcsa(Adapter); - - // Wireless mode dependent elements. - if( IS_WIRELESS_OFDM_24G(Adapter)) - { - // Capability. - if(ACTING_AS_IBSS(Adapter) == FALSE) - UNION_BEACON_PROBE_RSP_CAPABILITY_INFO(pbcn, cShortSlotTime); - - if( IS_WIRELESS_MODE_G(Adapter) || - (IS_WIRELESS_MODE_HT_24G(Adapter) && pMgntInfo->pHTInfo->bCurSuppCCK)) - { - if(pMgntInfo->bUseProtection) - ERPInfoContent[0] = ERP_UseProtection; - - FillOctetString(ERPInfo, ERPInfoContent, 1); - PacketMakeElement(&pMgntInfo->beaconframe, EID_ERPInfo, ERPInfo); - } - - // Extended Supported Rates. - if(ExtSuppRates.Length != 0) - { - PacketMakeElement(&pMgntInfo->beaconframe, EID_ExtSupRates, ExtSuppRates); - } - } - // <RJ_TODO> IS_WIRELESS_MODE_A() - - // - // Append Additional IEs from Ndis6, for DTM Vista 1.0c premium logo test. By Bruce, 2007-08-13. - // - if(!ACTING_AS_AP(Adapter)) - { - GetIbssAdditionalData(Adapter, &IbssAdditionalIEs); - if(IbssAdditionalIEs.Octet != NULL && IbssAdditionalIEs.Length != 0) - { - AppendAdditionalIEs(&pMgntInfo->beaconframe, IbssAdditionalIEs); - } - } - - RT_DISP(FBEACON, BCN_SHOW, - ("Support Mode=%x pMgntInfo->mIbss=%d pMgntInfo->dot11CurrentWirelessMode=%x\n", - Adapter->HalFunc.GetSupportedWirelessModeHandler(Adapter), pMgntInfo->mIbss, pMgntInfo->dot11CurrentWirelessMode)); - - // - // Include High Throuput capability and High Throuput info - // - Do not include HT if CurrentWirelessMode is less than N mode even if hardware support it - // - if(IS_WIRELESS_MODE_N(Adapter)) - { - // Construct HTCapability and HTInfo IE - OCTET_STRING osHTCap, osHTInfo; - - FillOctetString(osHTCap, &(pMgntInfo->pHTInfo->SelfHTCap), sizeof(pMgntInfo->pHTInfo->SelfHTCap)); - FillOctetString(osHTInfo, &(pMgntInfo->pHTInfo->SelfHTInfo), sizeof(pMgntInfo->pHTInfo->SelfHTInfo)); - HTConstructCapabilityElement(Adapter, &osHTCap, FALSE); - HTConstructInfoElement(Adapter, &osHTInfo); - - // TODO: Construct CAP info element here - PacketMakeElement(&pMgntInfo->beaconframe, EID_HTCapability, osHTCap); - PacketMakeElement(&pMgntInfo->beaconframe, EID_HTInfo, osHTInfo); - - // Construct Realtek Proprietary Aggregation mode (Set AMPDU Factor to 2, 32k) - { - OCTET_STRING osRealtekIEType2; - FillOctetString(osRealtekIEType2, pMgntInfo->RTIEType2Buffer, sizeof(pMgntInfo->RTIEType2Buffer)); - ConstructRTKAggElement(Adapter, &osRealtekIEType2); - PacketMakeElement(&pMgntInfo->beaconframe, EID_Vendor, osRealtekIEType2); - } - } - - if(IS_WIRELESS_MODE_AC(Adapter)) - { - OCTET_STRING osVHTCap, osVHTOperation; - - FillOctetString(osVHTCap, &(pMgntInfo->pVHTInfo->SelfVHTCap), sizeof(pMgntInfo->pVHTInfo->SelfVHTCap)); - FillOctetString(osVHTOperation, &(pMgntInfo->pVHTInfo->SelfVHTInfo), sizeof(pMgntInfo->pVHTInfo->SelfVHTInfo)); - VHTConstructCapabilityElement(Adapter, &osVHTCap, FALSE); - VHTConstructOperationElement(Adapter, &osVHTOperation); - - // TODO: Construct CAP & Operation element here - PacketMakeElement(&pMgntInfo->beaconframe, EID_VHTCapability, osVHTCap); - PacketMakeElement(&pMgntInfo->beaconframe, EID_VHTOperation, osVHTOperation); - } - - - //2004/07/22, kcwu, construct Security IE - //2004/09/15, kcwu, decide to construct which kind of element,WPA or WPA2 - if(pMgntInfo->SecurityInfo.AuthMode > RT_802_11AuthModeAutoSwitch) - { - PacketMakeElement(&pMgntInfo->beaconframe, (pMgntInfo->SecurityInfo.SecLvl == RT_SEC_LVL_WPA)?EID_Vendor:EID_WPA2, pMgntInfo->SecurityInfo.RSNIE); - } - - // - // Append Additional IEs from Ndis6, for DTM Vista 1.0c premium logo test. By Bruce, 2007-08-13. - // - if(ACTING_AS_IBSS(Adapter)) - { - GetIbssAdditionalData(Adapter, &IbssAdditionalIEs); - if(IbssAdditionalIEs.Octet != NULL && IbssAdditionalIEs.Length != 0) - { - AppendAdditionalIEs(&pMgntInfo->beaconframe, IbssAdditionalIEs); - } - - if(pMgntInfo->pStaQos->QosCapability != QOS_DISABLE) - { - FillOctetString(osEDCAInfoElem, EDCAInfo, 1); - PlatformZeroMemory(osEDCAInfoElem.Octet, 1); - AppendQoSElement(&pMgntInfo->beaconframe, &osEDCAInfoElem, OUI_SUBTYPE_WMM_INFO); - } - } - - // - // Append additional IEs. By haich, 2008.08.01. - // - if(ACTING_AS_AP(Adapter)) - { - if(pMgntInfo->AdditionalBeaconIESize > 0&& - pMgntInfo->AdditionalBeaconIEData != NULL && - pMgntInfo->beaconframe.Length + pMgntInfo->AdditionalBeaconIESize <= sMaxMpduLng) - { - OCTET_STRING osAdditionalBeaconIEs; - osAdditionalBeaconIEs.Length = (u2Byte)pMgntInfo->AdditionalBeaconIESize; - osAdditionalBeaconIEs.Octet = (pu1Byte)pMgntInfo->AdditionalBeaconIEData; - AppendAdditionalIEs(&pMgntInfo->beaconframe, osAdditionalBeaconIEs); - } - Ap_AppendWmmIe(Adapter, &pMgntInfo->beaconframe); - Ap_AppendCountryIE(Adapter, &pMgntInfo->beaconframe); - Ap_AppendPowerConstraintIE(Adapter, &pMgntInfo->beaconframe); - } - - WAPI_SecFuncHandler(WAPI_CONSTRUCTBEACON, Adapter, WAPI_END); - - WPS_ConstructBeaconFrame(Adapter); - - -#if (P2P_SUPPORT == 1) - P2P_Append_BeaconIe(Adapter); -#endif - - WFD_AppendBeaconIEs(Adapter, pMgntInfo->BcnSharedMemory.Length, &(pMgntInfo->beaconframe)); - -} - - -// -// Description: Construct a beacon frame according to current status and -// update the beacon to HW beacon queue. -// 2005.06.15, by rcnjko. -// -VOID -UpdateBeaconFrame( - PADAPTER Adapter - ) -{ - PADAPTER pDefaultAdapter = GetDefaultAdapter(Adapter); - - pDefaultAdapter->TxStats.NumTxBeaconUpdate++; - ConstructBeaconFrame(Adapter); - SendBeaconFrame(Adapter, BEACON_QUEUE); -} - -BOOLEAN -Isdot11acAvailable( - PADAPTER Adapter - ) -{ - u4Byte Availabledot11acCountry[] = {0x818, 0x368, 0x398, 0x417, 0x516, 0x643, 0x804, 0x360}; - u1Byte index, result; - - result = TRUE; - // RT_TRACE(COMP_INIT, DBG_LOUD, ("$$$ Isdot11acAvailable(): Adapter->bDisable11ac = %d\n", Adapter->bDisable11ac)); - if(Adapter->bDisable11ac) - { - result = FALSE; - return result; - } - for(index=0; index<(sizeof(Availabledot11acCountry)/4); index++) - { - if(SMBIOS_GET_COUNTRY_CODE(Adapter) == Availabledot11acCountry[index]) - { - result = FALSE; - break; - } - } - return result; -} - - -VOID -ConstructProbeRequest( - PADAPTER Adapter, - pu1Byte Buffer, - pu4Byte pLength, - BOOLEAN bBroadcastBssid, - BOOLEAN bAnySsid, - BOOLEAN bForcePowerSave - ) -{ - PMGNT_INFO pMgntInfo = &Adapter->MgntInfo; - OCTET_STRING os; - OCTET_STRING ProbeReq; - pu1Byte pProbeRequestPartial; - OCTET_STRING SuppRates; - u1Byte SuppRatesContent[8]; // NOTE! Length of Support Rates <= 8. - OCTET_STRING ExtSuppRates; - u1Byte ExtSuppRatesContent[255]; // NOTE! Length of Support Rates <= 255. - u1Byte RegSuppRatesIdx=0; - WIRELESS_MODE wirelessmode = WIRELESS_MODE_UNKNOWN; - - pProbeRequestPartial = Buffer; - - SET_80211_HDR_FRAME_CONTROL(pProbeRequestPartial, 0); - SET_80211_HDR_TYPE_AND_SUBTYPE(pProbeRequestPartial, Type_Probe_Req); - SET_80211_HDR_PWR_MGNT(pProbeRequestPartial, (bForcePowerSave) ? 1 : 0); - SET_80211_HDR_DURATION(pProbeRequestPartial, 0); - SET_80211_HDR_ADDRESS1(pProbeRequestPartial, BroadcastAddress); - SET_80211_HDR_ADDRESS2(pProbeRequestPartial, Adapter->CurrentAddress); - if(bBroadcastBssid) - { - SET_80211_HDR_ADDRESS3(pProbeRequestPartial, BroadcastAddress); - } - else - { - SET_80211_HDR_ADDRESS3(pProbeRequestPartial, Adapter->MgntInfo.Bssid); - } - - SET_80211_HDR_FRAGMENT_SEQUENCE(pProbeRequestPartial, 0); - - //3 Size of Probe Request, can not use sizeof(GeneralPacketPartial) - FillOctetString(ProbeReq, Buffer, 0x18); - - // TODO: Change length - if(bAnySsid) - { - FillOctetString(os, NULL, 0); - PacketMakeElement(&ProbeReq, EID_SsId, os); - } - else - { - PacketMakeElement(&ProbeReq, EID_SsId, pMgntInfo->Ssid); - } - - // Supported rates - FillOctetString(SuppRates, SuppRatesContent, 0); - FillOctetString(ExtSuppRates, ExtSuppRatesContent, 0); - - // - // Basic rate setting should follow default setting in registry - // instead of CurrentWirelessMode. Otherwise, previous connection may effect on - // later connection. Neo, 2011/11/9 - - // 2011/03/17 MH For 92D, we need to change RegWirelessMode when dual mac contrl algorithm - // want to switch between 2.4G & 5G. - if (IS_WIRELESS_MODE_24G(Adapter) ) - { - RegSuppRatesIdx = 2; - wirelessmode = WIRELESS_MODE_N_24G; - - if (Adapter->RegWirelessMode == WIRELESS_MODE_B) - { - RegSuppRatesIdx = 1; - wirelessmode = WIRELESS_MODE_B; - } - else if (Adapter->RegWirelessMode == WIRELESS_MODE_G) - wirelessmode = WIRELESS_MODE_G; - else if(Adapter->RegWirelessMode == WIRELESS_MODE_AC_24G) - wirelessmode = WIRELESS_MODE_AC_24G; - } - else if (IS_WIRELESS_MODE_5G(Adapter)) - { - RegSuppRatesIdx = 0; - - if(Adapter->HalFunc.GetSupportedWirelessModeHandler(Adapter) & WIRELESS_MODE_AC_5G) - wirelessmode = WIRELESS_MODE_AC_5G; - else - wirelessmode = WIRELESS_MODE_N_5G; - - if (Adapter->RegWirelessMode == WIRELESS_MODE_AC_5G) - wirelessmode = WIRELESS_MODE_AC_5G; - else if (Adapter->RegWirelessMode == WIRELESS_MODE_N_5G) - wirelessmode = WIRELESS_MODE_N_5G; - else if (Adapter->RegWirelessMode == WIRELESS_MODE_A) - wirelessmode = WIRELESS_MODE_A; - } -#if 0 - if(!Isdot11acAvailable(Adapter)) - { - if(wirelessmode == WIRELESS_MODE_AC_5G) - { - wirelessmode = WIRELESS_MODE_N_5G; - } - if(wirelessmode == WIRELESS_MODE_AC_24G) - { - wirelessmode = WIRELESS_MODE_N_24G; - } - RT_TRACE(COMP_MLME, DBG_TRACE, ("ConstructProbeRequest(): wirelessmode = %d\n", wirelessmode)); - } -#endif - - SelectSupportedRatesElement( wirelessmode, pMgntInfo->RegSuppRateSets[RegSuppRatesIdx], FALSE,&SuppRates, &ExtSuppRates ); - - PacketMakeElement(&ProbeReq, EID_SupRates, SuppRates); - // Extended supported rates - if(ExtSuppRates.Length != 0) - { - PacketMakeElement(&ProbeReq, EID_ExtSupRates, ExtSuppRates); - } - - - // - // Simple config IE. by CCW - copy from 818x - // - if(GET_SIMPLE_CONFIG_ENABLED(pMgntInfo)) - { - WPS_AppendElement(Adapter, &ProbeReq, TRUE, WPS_INFO_PROBEREQ_IE); - } - - // - // For CCXv4 S59.2.3 - // - CCX_RM_AppendRmCapIE(Adapter, &ProbeReq); - - - //merge from 1020 to pass WHCK Scan_AdditionalIE - if( pMgntInfo->AdditionalProbeReqIESize > 0&& - pMgntInfo->AdditionalProbeReqIEData != NULL && - ProbeReq.Length + pMgntInfo->AdditionalProbeReqIESize <= sMaxMpduLng) - { - OCTET_STRING osAdditionalIEs; - osAdditionalIEs.Length = (u2Byte)pMgntInfo->AdditionalProbeReqIESize; - osAdditionalIEs.Octet = (pu1Byte)pMgntInfo->AdditionalProbeReqIEData; - - - AppendAdditionalIEs(&ProbeReq, osAdditionalIEs); - } - - - // - // HT Capability IE. by Joseph - according to 802.11n latest spec. - // - if( (Adapter->HalFunc.GetSupportedWirelessModeHandler(Adapter)>WIRELESS_MODE_AUTO) && - (Adapter->RegWirelessMode >= WIRELESS_MODE_AUTO)) - { - FillOctetString(os, &(pMgntInfo->pHTInfo->SelfHTCap), sizeof(pMgntInfo->pHTInfo->SelfHTCap)); - HTConstructCapabilityElement(Adapter, &os, FALSE); - PacketMakeElement(&ProbeReq, EID_HTCapability, os); - } - - if(pMgntInfo->AdditionalProbeReqIESize > 0&& - pMgntInfo->AdditionalProbeReqIEData != NULL && - ProbeReq.Length + pMgntInfo->AdditionalProbeReqIESize <= sMaxMpduLng) - { - OCTET_STRING osAdditionalIEs; - osAdditionalIEs.Length = (u2Byte)pMgntInfo->AdditionalProbeReqIESize; - osAdditionalIEs.Octet = (pu1Byte)pMgntInfo->AdditionalProbeReqIEData; - - - AppendAdditionalIEs(&ProbeReq, osAdditionalIEs); - } - - if(wirelessmode == WIRELESS_MODE_AC_5G || wirelessmode == WIRELESS_MODE_AC_24G) - { - FillOctetString(os, &(pMgntInfo->pVHTInfo->SelfVHTCap), sizeof(pMgntInfo->pVHTInfo->SelfVHTCap)); - VHTConstructCapabilityElement(Adapter, &os, FALSE); - PacketMakeElement(&ProbeReq, EID_VHTCapability, os); - } - -#if P2P_SUPPORT == 1 - // Solution for service discovery. - P2P_Append_ProbeReqIe(&ProbeReq, GET_P2P_INFO(Adapter)); -#endif - - // Append WFD Probe request IEs - WFD_AppendProbeReqIEs(Adapter, Adapter->MAX_TRANSMIT_BUFFER_SIZE, &ProbeReq); - - *pLength=ProbeReq.Length; -} - -// -// Description: -// Advanced version of ConstructProbeRequest, please refer to SendProbeReq for -// more information. -// 2006.12.20, by shien chang. -// -VOID -ConstructProbeRequestEx( - PADAPTER Adapter, - pu1Byte Buffer, - pu4Byte pLength, - OCTET_STRING Ssid, - BOOLEAN bForcePowerSave - ) -{ - PMGNT_INFO pMgntInfo = &Adapter->MgntInfo; - OCTET_STRING ProbeReq; - pu1Byte pProbeRequestPartial; - OCTET_STRING SuppRates; - u1Byte SuppRatesContent[8]; // NOTE! Length of Support Rates <= 8. - OCTET_STRING ExtSuppRates; - u1Byte ExtSuppRatesContent[255]; // NOTE! Length of Support Rates <= 255. - OCTET_STRING os; - u1Byte RegSuppRatesIdx=0; - WIRELESS_MODE wirelessmode = WIRELESS_MODE_UNKNOWN; - - pProbeRequestPartial = Buffer; - - SET_80211_HDR_FRAME_CONTROL(pProbeRequestPartial, 0); - SET_80211_HDR_TYPE_AND_SUBTYPE(pProbeRequestPartial, Type_Probe_Req); - SET_80211_HDR_PWR_MGNT(pProbeRequestPartial, (bForcePowerSave) ? 1 : 0); - SET_80211_HDR_DURATION(pProbeRequestPartial, 0); - SET_80211_HDR_ADDRESS1(pProbeRequestPartial, BroadcastAddress); - SET_80211_HDR_ADDRESS2(pProbeRequestPartial, Adapter->CurrentAddress); - SET_80211_HDR_ADDRESS3(pProbeRequestPartial, BroadcastAddress); - - SET_80211_HDR_FRAGMENT_SEQUENCE(pProbeRequestPartial, 0); - - //3 Size of Probe Request, can not use sizeof(GeneralPacketPartial) - FillOctetString(ProbeReq, Buffer, 0x18); - - // Probe request with SSID. - PacketMakeElement(&ProbeReq, EID_SsId, Ssid); - - // Supported rates -// PacketMakeElement(&ProbeReq, EID_SupRates, Adapter->MgntInfo.SupportedRates); - FillOctetString(SuppRates, SuppRatesContent, 0); - FillOctetString(ExtSuppRates, ExtSuppRatesContent, 0); - - // - // Basic rate setting should follow default setting in registry - // instead of CurrentWirelessMode. Otherwise, previous connection may effect on - // later connection. Neo, 2011/11/9 - - // 2011/03/17 MH For 92D, we need to change RegWirelessMode when dual mac contrl algorithm - // want to switch between 2.4G & 5G. - if (IS_WIRELESS_MODE_24G(Adapter) ) - { - RegSuppRatesIdx = 2; - wirelessmode = WIRELESS_MODE_N_24G; - - if (Adapter->RegWirelessMode == WIRELESS_MODE_B) - { - RegSuppRatesIdx = 1; - wirelessmode = WIRELESS_MODE_B; - } - else if (Adapter->RegWirelessMode == WIRELESS_MODE_G) - wirelessmode = WIRELESS_MODE_G; - else if(Adapter->RegWirelessMode == WIRELESS_MODE_AC_24G) - wirelessmode = WIRELESS_MODE_AC_24G; - } - else if (IS_WIRELESS_MODE_5G(Adapter)) - { - RegSuppRatesIdx = 0; - - if(Adapter->HalFunc.GetSupportedWirelessModeHandler(Adapter) & WIRELESS_MODE_AC_5G) - wirelessmode = WIRELESS_MODE_AC_5G; - else - wirelessmode = WIRELESS_MODE_N_5G; - - if (Adapter->RegWirelessMode == WIRELESS_MODE_AC_5G) - wirelessmode = WIRELESS_MODE_AC_5G; - else if (Adapter->RegWirelessMode == WIRELESS_MODE_N_5G) - wirelessmode = WIRELESS_MODE_N_5G; - else if (Adapter->RegWirelessMode == WIRELESS_MODE_A) - wirelessmode = WIRELESS_MODE_A; - } - - SelectSupportedRatesElement( wirelessmode, pMgntInfo->RegSuppRateSets[RegSuppRatesIdx], FALSE,&SuppRates, &ExtSuppRates ); - PacketMakeElement(&ProbeReq, EID_SupRates, SuppRates); - // Extended supported rates - if(ExtSuppRates.Length != 0) - { - PacketMakeElement(&ProbeReq, EID_ExtSupRates, ExtSuppRates); - } - - // - // Simple config IE. by CCW - copy from 818x - // - if(GET_SIMPLE_CONFIG_ENABLED(pMgntInfo)) - { - WPS_AppendElement(Adapter, &ProbeReq, TRUE, WPS_INFO_PROBEREQ_IE); - } - - // - // HT Capability IE. by Joseph - according to 802.11n latest spec. - // - if((Adapter->HalFunc.GetSupportedWirelessModeHandler(Adapter)>WIRELESS_MODE_AUTO) && - (Adapter->RegWirelessMode >= WIRELESS_MODE_AUTO)) - { - FillOctetString(os, &(pMgntInfo->pHTInfo->SelfHTCap), sizeof(pMgntInfo->pHTInfo->SelfHTCap)); - HTConstructCapabilityElement(Adapter, &os, FALSE); - PacketMakeElement(&ProbeReq, EID_HTCapability, os); - } - -#if P2P_SUPPORT == 1 - // Solution for service discovery. - P2P_Append_ProbeReqIe(&ProbeReq, GET_P2P_INFO(Adapter)); -#endif - - // Append WFD Probe request IEs - WFD_AppendProbeReqIEs(Adapter, Adapter->MAX_TRANSMIT_BUFFER_SIZE, &ProbeReq); - - if((Adapter->HalFunc.GetSupportedWirelessModeHandler(Adapter) & WIRELESS_MODE_AC_5G) && - (Adapter->RegWirelessMode ==WIRELESS_MODE_AUTO || Adapter->RegWirelessMode == WIRELESS_MODE_AC_5G)) - { - FillOctetString(os, &(pMgntInfo->pVHTInfo->SelfVHTCap), sizeof(pMgntInfo->pVHTInfo->SelfVHTCap)); - VHTConstructCapabilityElement(Adapter, &os, FALSE); - PacketMakeElement(&ProbeReq, EID_VHTCapability, os); - } - - *pLength=ProbeReq.Length; -} - -VOID -ConstructAuthenticatePacket( - PADAPTER Adapter, - pu1Byte Buffer, - pu4Byte pLength, - pu1Byte auStaAddr, - u1Byte AuthAlg, - u1Byte AuthSeq, - u1Byte AuthStatusCode, - OCTET_STRING AuthChallengetext - ) -{ - PMGNT_INFO pMgntInfo = &Adapter->MgntInfo; - pu1Byte pAuthPartial = Buffer; - OCTET_STRING osAuthPkt = {Buffer, 0}; - RT_STATUS rtStatus = RT_STATUS_SUCCESS; - - RT_TRACE(COMP_MLME, DBG_LOUD, ("===> ConstructAuthenticatePacket()\n")); - - SET_80211_HDR_FRAME_CONTROL(osAuthPkt.Octet, 0); - SET_80211_HDR_TYPE_AND_SUBTYPE(osAuthPkt.Octet, Type_Auth); - SET_80211_HDR_DURATION(osAuthPkt.Octet, 0); - - SET_80211_HDR_ADDRESS1(osAuthPkt.Octet, auStaAddr); - SET_80211_HDR_ADDRESS2(osAuthPkt.Octet, Adapter->CurrentAddress); - SET_80211_HDR_ADDRESS3(osAuthPkt.Octet, Adapter->MgntInfo.Bssid); - SET_80211_HDR_FRAGMENT_SEQUENCE(osAuthPkt.Octet, 0); - - if(AuthSeq != 3) - { - //add for CCX NETWORK EAP (LEAP) 2006.07.31 ,by CCW - if( !Adapter->MgntInfo.bNETWORKEAP) - SET_AUTH_FRAME_AUTH_ALG_NUM(osAuthPkt.Octet, AuthAlg); // Auth Algorithm: Open system - else - SET_AUTH_FRAME_AUTH_ALG_NUM(osAuthPkt.Octet, NETWORK_EAP); //Auth Algorithm: NETWORK EAP - - SET_AUTH_FRAME_AUTH_SEQ_NUM(osAuthPkt.Octet, AuthSeq); // Auth Seq Num - SET_AUTH_FRAME_STATUS_CODE(osAuthPkt.Octet, AuthStatusCode); // Status Code: Reserved - - osAuthPkt.Length = 30; - - if( AuthChallengetext.Length != 0 ){ - pu1Byte buf = GET_AUTH_FRAME_CHALLENG_TEXT(osAuthPkt.Octet); - buf[0] = (u1Byte)EID_Ctext; - buf[1] = (u1Byte)AuthChallengetext.Length; - PlatformMoveMemory( buf + 2, AuthChallengetext.Octet, AuthChallengetext.Length); - osAuthPkt.Length += (AuthChallengetext.Length + 2); - } - else if(1 == AuthSeq) - { - //4 // RSN IE - if(RT_STATUS_SUCCESS != (rtStatus = - Sec_AppendRSNIE( - Adapter, // Adapter context - (CONTENT_PKT_TYPE_802_11 | CONTENT_PKT_TYPE_CLIENT), // content type - &(pMgntInfo->targetBSS), // target info - sizeof(RT_WLAN_BSS), // target info length - Adapter->MAX_TRANSMIT_BUFFER_SIZE, // Content max length capacity - &osAuthPkt // Packet Content octet string - ))) - { - RT_TRACE_F(COMP_SEC, DBG_TRACE, ("Fail (0x%08X) to append RSN IE\n", rtStatus)); - } - - //4 // Fast Transition MD IE - if(RT_STATUS_SUCCESS != (rtStatus = - FT_AppendMdIE( - Adapter, // Adapter context - (CONTENT_PKT_TYPE_802_11 | CONTENT_PKT_TYPE_CLIENT), // content type - &(pMgntInfo->targetBSS), // target info - sizeof(RT_WLAN_BSS), // target info length - Adapter->MAX_TRANSMIT_BUFFER_SIZE, // Content max length capacity - &osAuthPkt // Packet Content octet string - ))) - { - RT_TRACE_F(COMP_MLME, DBG_TRACE, ("Fail (0x%08X) to append MD IE\n", rtStatus)); - } - - //4 // Fast Transition FT IE - if(RT_STATUS_SUCCESS != (rtStatus = - FT_AppendFtIE( - Adapter, // Adapter context - (CONTENT_PKT_TYPE_802_11 | CONTENT_PKT_TYPE_CLIENT), // content type - &(pMgntInfo->targetBSS), // target info - sizeof(RT_WLAN_BSS), // target info length - Adapter->MAX_TRANSMIT_BUFFER_SIZE, // Content max length capacity - &osAuthPkt // Packet Content octet string - ))) - { - RT_TRACE_F(COMP_MLME, DBG_TRACE, ("Fail (0x%08X) to append FT IE\n", rtStatus)); - } - } - } - else - { // 3rd auth frame. 2005.03.08, by rcnjko. - // Set WEP bit, see also MgntGetEncryptionInfo(), 2005.08.18, by rcnjko. - SET_80211_HDR_WEP(osAuthPkt.Octet, 1); - - // Auth Alg Num. - *((UNALIGNED pu2Byte)(osAuthPkt.Octet+28)) = EF2Byte(AuthAlg); // 24+4+0, 802.11 Header + IV + field offset - // Auth Seq Num. - *((UNALIGNED pu2Byte)(osAuthPkt.Octet+30)) = EF2Byte(AuthSeq); // 24+4+2 - // Status Code. - *((UNALIGNED pu2Byte)(osAuthPkt.Octet+32)) = EF2Byte(AuthStatusCode); // 24+4+4 - osAuthPkt.Length = 34; // 24+4+6 - - // Challenge text. - if( AuthChallengetext.Length != 0 ) - { - pu1Byte buf = osAuthPkt.Octet + 34; // 24+4+6 - - buf[0] = (u1Byte)EID_Ctext; - buf[1] = (u1Byte)AuthChallengetext.Length; - PlatformMoveMemory( buf + 2, AuthChallengetext.Octet, AuthChallengetext.Length); - osAuthPkt.Length += (AuthChallengetext.Length + 2); - } - } - *pLength = osAuthPkt.Length; - - RT_TRACE(COMP_MLME, DBG_LOUD, ("<=== ConstructAuthenticatePacket()\n")); -} - -VOID -ConstructAssociateReqEpig( - IN PADAPTER Adapter, - IN POCTET_STRING pAsocReq, - IN POCTET_STRING pVHTCap - ) -{ - OCTET_STRING EpigIE; - u1Byte EpigIEContent[100]; - - if(Adapter->MgntInfo.bRegIOTBcm256QAM == FALSE) - return; - - FillOctetString(EpigIE, EpigIEContent, 0); - - { - u1Byte Epigram11ACCap[7] = {0x00, 0x90, 0x4C, 0x04, 0x08, 0xBF, 0x0C} ; - PlatformMoveMemory(EpigIEContent, Epigram11ACCap, 7); - PlatformMoveMemory(EpigIEContent+7, pVHTCap->Octet, pVHTCap->Length); - EpigIE.Length = 19; - PacketMakeElement(pAsocReq, EID_Vendor, EpigIE); - } - -} - - -VOID -ConstructAssociateReq( - PADAPTER Adapter, - pu1Byte Buffer, - pu4Byte pLength, - pu1Byte asocStaAddr, - u2Byte asocCap, - u2Byte asocListenInterval, - OCTET_STRING asocSsid, - OCTET_STRING asocSuppRates - ) -{ - PMGNT_INFO pMgntInfo = &Adapter->MgntInfo; - OCTET_STRING AsocReq; - pu1Byte pAsocPartial; - OCTET_STRING SuppRates; - u1Byte SuppRatesContent[8]; // NOTE! Length of Support Rates <= 8. - OCTET_STRING ExtSuppRates; - u1Byte ExtSuppRatesContent[255]; // NOTE! Length of Extended Support Rates <= 255. - BOOLEAN bFilterCck = FALSE; - RT_STATUS rtStatus = RT_STATUS_SUCCESS; - - - RT_TRACE(COMP_MLME, DBG_LOUD, ("===> ConstructAssociateReq()\n")); - - // - // Construct CCXv5 Special Association Req Packet for S64 Diagnostic Channel. - // By Bruce, 2009-09-21. - // - if (CCX_Construct_DiagChnl_AssocReq(Adapter, Buffer, pLength)) - return; - - pAsocPartial = Buffer; - - SET_80211_HDR_FRAME_CONTROL(pAsocPartial, 0); - SET_80211_HDR_TYPE_AND_SUBTYPE(pAsocPartial, Type_Asoc_Req); - SET_80211_HDR_DURATION(pAsocPartial, 0); - - SET_80211_HDR_ADDRESS1(pAsocPartial, asocStaAddr); - SET_80211_HDR_ADDRESS2(pAsocPartial, Adapter->CurrentAddress); - SET_80211_HDR_ADDRESS3(pAsocPartial, Adapter->MgntInfo.Bssid); - SET_80211_HDR_FRAGMENT_SEQUENCE(pAsocPartial, 0); - - // TODO: Change this - SET_ASOC_REQ_CAPABILITY_INFO(pAsocPartial, asocCap); - SET_ASOC_REQ_LISTEN_INTERVAL(pAsocPartial, asocListenInterval); - - //3 Size of Associate Request, can not use sizeof(AssociateReqPartial) - FillOctetString(AsocReq, Buffer, 0x1c); - - // SSID element - PacketMakeElement(&AsocReq, EID_SsId, asocSsid); - - P2P_ConstructAssociateReqFilterCck(Adapter, AsocReq, &bFilterCck); - - // Supported rates element - FillOctetString(SuppRates, SuppRatesContent, 0); - FillOctetString(ExtSuppRates, ExtSuppRatesContent, 0); - SelectSupportedRatesElement( pMgntInfo->dot11CurrentWirelessMode, asocSuppRates, bFilterCck, &SuppRates, &ExtSuppRates ); - PacketMakeElement(&AsocReq, EID_SupRates, SuppRates); - - // Extended supported rates - if(ExtSuppRates.Length != 0) - { - PacketMakeElement(&AsocReq, EID_ExtSupRates, ExtSuppRates); - } - - if(!GET_SIMPLE_CONFIG_ENABLED(pMgntInfo)) - { - // RSNIE. 2004/07/22, kcwu. - if(pMgntInfo->SecurityInfo.AuthMode > RT_802_11AuthModeAutoSwitch) - { - //Fix WPA/WPA2 AP connect fail when wapi is support - //Modified by ylb, 20110906 - if (pMgntInfo->SecurityInfo.AuthMode == RT_802_11AuthModeWAPI || pMgntInfo->SecurityInfo.AuthMode == RT_802_11AuthModeCertificateWAPI ) - { - WAPI_SecFuncHandler(WAPI_CONSTRUCTASSOCIATEREQ, Adapter, (PVOID)&AsocReq, WAPI_END); - } - else - { - //4 // WPA IE - if(RT_STATUS_SUCCESS != (rtStatus = - Sec_AppendWPAIE( - Adapter, // Adapter context - (CONTENT_PKT_TYPE_802_11 | CONTENT_PKT_TYPE_CLIENT), // content type - &(pMgntInfo->targetBSS), // target info - sizeof(RT_WLAN_BSS), // target info length - Adapter->MAX_TRANSMIT_BUFFER_SIZE, // Content max length capacity - &AsocReq // Packet Content octet string - ))) - { - RT_TRACE_F(COMP_SEC, DBG_TRACE, ("Fail (0x%08X) to append WPA IE\n", rtStatus)); - } - - //4 // RSN IE - if(RT_STATUS_SUCCESS != (rtStatus = - Sec_AppendRSNIE( - Adapter, // Adapter context - (CONTENT_PKT_TYPE_802_11 | CONTENT_PKT_TYPE_CLIENT), // content type - &(pMgntInfo->targetBSS), // target info - sizeof(RT_WLAN_BSS), // target info length - Adapter->MAX_TRANSMIT_BUFFER_SIZE, // Content max length capacity - &AsocReq // Packet Content octet string - ))) - { - RT_TRACE_F(COMP_SEC, DBG_TRACE, ("Fail (0x%08X) to append RSN IE\n", rtStatus)); - } - - //4 // Fast Transition MD IE - if(RT_STATUS_SUCCESS != (rtStatus = - FT_AppendMdIE( - Adapter, // Adapter context - (CONTENT_PKT_TYPE_802_11 | CONTENT_PKT_TYPE_CLIENT), // content type - &(pMgntInfo->targetBSS), // target info - sizeof(RT_WLAN_BSS), // target info length - Adapter->MAX_TRANSMIT_BUFFER_SIZE, // Content max length capacity - &AsocReq // Packet Content octet string - ))) - { - RT_TRACE_F(COMP_MLME, DBG_LOUD, ("Fail (0x%08X) to append MD IE\n", rtStatus)); - } - } - } - } - - DFS_StaConstructAssociateReq(Adapter, asocCap, AsocReq); - - if( pMgntInfo->pStaQos->CurrentQosMode > QOS_DISABLE ) - { - PacketMakeElement( &AsocReq, EID_Vendor, pMgntInfo->pStaQos->WMMIE ); - } - - // Append CCX Aironet IE for CCXv1 S19, S13, CCXv4 S61. - CCX_AppendAironetIE(Adapter, &AsocReq); - - // CCX 2 S31 AP Control of Client Transmit Power (TPC). - CCX_AppendCcxCellPowerIE(Adapter, &AsocReq); - - // For CCX 2 S36, Radio Management Capability element, 2006.05.15, by rcnjko. - CCX_RM_AppendRmCapIE(Adapter, &AsocReq); - - // For CCX 2 S38, WLAN Device Version Number element. - CCX_AppendCcxVerIE(Adapter, &AsocReq); - - // For CCX S67 MFP - CCX_AppendCcxSFAIE(Adapter, &AsocReq); - - // Include High Throuput capability - if( pMgntInfo->pHTInfo->bCurrentHTSupport ) - { - // Construct HTCapability and HTInfo IE - OCTET_STRING osHTCap; - RT_TRACE(COMP_HT, DBG_LOUD, ("ConstructAssociateReq(): Trying to associate to an 802.11n HT AP\n")); - FillOctetString(osHTCap, &(pMgntInfo->pHTInfo->SelfHTCap), sizeof(pMgntInfo->pHTInfo->SelfHTCap)); - HTConstructCapabilityElement(Adapter, &osHTCap, TRUE); - if(pMgntInfo->pHTInfo->ePeerHTSpecVer == HT_SPEC_VER_EWC) - PacketMakeElement(&AsocReq, EID_Vendor, osHTCap); - else - PacketMakeElement(&AsocReq, EID_HTCapability, osHTCap); - - BSS_AppendExentedCapElement(Adapter, &AsocReq); - } - - if(pMgntInfo->pVHTInfo->bCurrentVHTSupport ) - { - OCTET_STRING osVHTCap; - u1Byte opmode = 0; - OCTET_STRING osVHTNotif; - CHANNEL_WIDTH opNotifBW = CHNL_GetRegBWSupport(Adapter); - u1Byte opNotifNss = pMgntInfo->pVHTInfo->nRxSPStream; - - RT_TRACE(COMP_HT, DBG_LOUD, ("ConstructAssociateReq(): Trying to associate to an 802.11ac VHT AP\n")); - FillOctetString(osVHTCap, &(pMgntInfo->pVHTInfo->SelfVHTCap), sizeof(pMgntInfo->pVHTInfo->SelfVHTCap)); - VHTConstructCapabilityElement(Adapter, &osVHTCap, TRUE); - PacketMakeElement(&AsocReq, EID_VHTCapability, osVHTCap); - - if(pMgntInfo->pVHTInfo->bOpModeNotif) - { - opNotifBW = pMgntInfo->pVHTInfo->BWToSwitch; - DbgPrint("pMgntInfo->pVHTInfo->bOpModeNotif = TRYE BW = %d\n", opNotifBW); - opNotifNss = pMgntInfo->pVHTInfo->RxSSToSwitch; - } - - RT_TRACE(COMP_HT, DBG_LOUD, ("ConstructAssociateReq(): carry operating mode notification with BW(%d) RxSS(%d)\n", opNotifBW, opNotifNss)); - FillOctetString(osVHTNotif, &opmode, sizeof(opmode)); - SET_VHT_OPERATING_MODE_FIELD_CHNL_WIDTH(&opmode, opNotifBW); - SET_VHT_OPERATING_MODE_FIELD_RX_NSS(&opmode, (opNotifNss-1)); - SET_VHT_OPERATING_MODE_FIELD_RX_NSS_TYPE(&opmode, pMgntInfo->pVHTInfo->RxSSTypeBfmeeToSwitch); - - PacketMakeElement(&AsocReq, EID_OpModeNotification, osVHTNotif); - } - - // For WiFi VHT Testbed, it requires special feature: VHT under TKIP & WEP mode - if(pMgntInfo->VhtWeakSecurity > 0) - { - OCTET_STRING osHTCap; - OCTET_STRING osVHTCap; - WIRELESS_MODE wirelessModeBackup = pMgntInfo->dot11CurrentWirelessMode; - - RT_TRACE(COMP_HT, DBG_LOUD, ("ConstructAssociateReq(): Trying to associate to an 802.11n HT AP\n")); - RT_TRACE(COMP_HT, DBG_LOUD, ("ConstructAssociateReq(): carry VHT IE due to WiFi tested special feature\n")); - FillOctetString(osHTCap, &(pMgntInfo->pHTInfo->SelfHTCap), sizeof(pMgntInfo->pHTInfo->SelfHTCap)); - FillOctetString(osVHTCap, &(pMgntInfo->pVHTInfo->SelfVHTCap), sizeof(pMgntInfo->pVHTInfo->SelfVHTCap)); - - pMgntInfo->dot11CurrentWirelessMode = WIRELESS_MODE_AC_5G; - MgntRefreshSuppRateSet(Adapter); - pMgntInfo->dot11CurrentWirelessMode = wirelessModeBackup; - - // HT IE - HTConstructCapabilityElement(Adapter, &osHTCap, TRUE); - PacketMakeElement(&AsocReq, EID_HTCapability, osHTCap); - // VHT IE - VHTConstructCapabilityElement(Adapter, &osVHTCap, TRUE); - PacketMakeElement(&AsocReq, EID_VHTCapability, osVHTCap); - } - - // Construct Realtek Proprietary Aggregation mode (Set AMPDU Factor to 2, 32k) - //2008.08.13 If connect to realtek ap, append realtek OUI for WOW - if(pMgntInfo->bRealtekAggCapExist) - { - OCTET_STRING osRealtekIEType2; - FillOctetString(osRealtekIEType2, pMgntInfo->RTIEType2Buffer, sizeof(pMgntInfo->RTIEType2Buffer)); - ConstructRTKAggElement(Adapter, &osRealtekIEType2); - PacketMakeElement(&AsocReq, EID_Vendor, osRealtekIEType2); - } - - // - // Simple config IE. by CCW - copy from 818x - // - if(GET_SIMPLE_CONFIG_ENABLED(pMgntInfo)) - { - WPS_AppendElement(Adapter, &AsocReq, FALSE, WPS_INFO_ASOCREQ_IE); - } - - // - // CCX4 CAC -- TSPEC IE, 2006.06.26, by shien chang. - // - if (CCX_CAC_IsVoiceTsExist(Adapter)) - { - WMM_TSPEC tsVoice, tsSignal; - OCTET_STRING VoiceEle, SignalEle; - PQOS_TSTREAM pTs = NULL; - PSTA_QOS pStaQos = pMgntInfo->pStaQos; - u1Byte tidVoice = 0; - - RT_TRACE(COMP_MLME, DBG_LOUD, ("ConstructAssociateReq(): CCX_CAC_ConstructVoiceTspec...\n")); - CCX_CAC_ConstructVoiceTspec(Adapter, tsVoice); - FillOctetString(VoiceEle, &tsVoice[2], TSPEC_SIZE - 2); - PacketMakeElement( &AsocReq, EID_Vendor, VoiceEle ); - - RT_TRACE(COMP_MLME, DBG_LOUD, ("ConstructAssociateReq(): CCX_CAC_ConstructSignalTspec...\n")); - CCX_CAC_ConstructSignalTspec(Adapter, tsSignal); - FillOctetString(SignalEle, &tsSignal[2], TSPEC_SIZE - 2); - PacketMakeElement( &AsocReq, EID_Vendor, SignalEle ); - - // TSRS IE - pTs = &(pStaQos->StaTsArray[tidVoice]); - if (QOS_RATE_TO_BPS( QosGetNPR(Adapter, pTs) ) >= - GET_TSPEC_MIN_PHY_RATE(pTs->OutStandingTSpec) ) - { - QosConstructTSRS(Adapter, pTs, &AsocReq); - } - } - -#if (WPS_SUPPORT == 1) - // Append customized IE, by hpfan - if(pMgntInfo->bCustomizedAsocIE) - { - OCTET_STRING osCustomizedIE; - - RT_PRINT_DATA(COMP_MLME, DBG_LOUD, ("ConstructAssociateReq(): append customzied association req IE\n"), pMgntInfo->CustomizedAsocIEBuf, pMgntInfo->CustomizedAsocIELength); - osCustomizedIE.Length = pMgntInfo->CustomizedAsocIELength; - osCustomizedIE.Octet = &pMgntInfo->CustomizedAsocIEBuf[0]; - AppendAdditionalIEs(&AsocReq, osCustomizedIE); - } -#endif - - // - // Append additional IEs. By haich, 2008.11.27. - // - RT_PRINT_DATA(COMP_OID_SET | COMP_MLME, DBG_LOUD, "ConstructAssociateReq(): append AssocReqIE", - pMgntInfo->AdditionalAssocReqIEData, pMgntInfo->AdditionalAssocReqIESize); - - if(pMgntInfo->AdditionalAssocReqIESize > 0&& - pMgntInfo->AdditionalAssocReqIEData != NULL && - AsocReq.Length + pMgntInfo->AdditionalAssocReqIESize <= sMaxMpduLng) - { - OCTET_STRING osAdditionalIEs; - osAdditionalIEs.Length = (u2Byte)pMgntInfo->AdditionalAssocReqIESize; - osAdditionalIEs.Octet = (pu1Byte)pMgntInfo->AdditionalAssocReqIEData; - - - AppendAdditionalIEs(&AsocReq, osAdditionalIEs); - } - -#if (P2P_SUPPORT == 1) - P2P_Append_AssociationReqIe(&AsocReq, Adapter); -#endif - - WFD_AppendAssocReqIEs(Adapter, Adapter->MAX_TRANSMIT_BUFFER_SIZE, &AsocReq); - - *pLength=AsocReq.Length; - - RT_TRACE(COMP_MLME, DBG_LOUD, ("<=== ConstructAssociateReq()\n")); -} - -VOID -ConstructReAssociateReq( - PADAPTER Adapter, - pu1Byte Buffer, - pu4Byte pLength, - pu1Byte ReasocStaAddr, - u2Byte ReasocCap, - u2Byte ReasocListenInterval, - pu1Byte CurrentasocStaAddr, - OCTET_STRING ReasocSsid, - OCTET_STRING ReasocSuppRates - ) -{ - PMGNT_INFO pMgntInfo = &Adapter->MgntInfo; - OCTET_STRING ReAsocReq; - pu1Byte pReAsocPartial; - OCTET_STRING SuppRates; - u1Byte SuppRatesContent[8]; // NOTE! Length of Support Rates <= 8. - OCTET_STRING ExtSuppRates; - u1Byte ExtSuppRatesContent[255]; // NOTE! Length of Extended Support Rates <= 255. - OCTET_STRING CCKMIE; - u1Byte CCKMIEBuff[30] ={0}; - RT_STATUS rtStatus = RT_STATUS_SUCCESS; - - RT_TRACE(COMP_MLME, DBG_LOUD, ("===> ConstructReAssociateReq()\n")); - - pReAsocPartial = Buffer; - //Init CCKM IE - CCKMIE.Octet = CCKMIEBuff; - - SET_80211_HDR_FRAME_CONTROL(pReAsocPartial, 0); - SET_80211_HDR_TYPE_AND_SUBTYPE(pReAsocPartial, Type_Reasoc_Req); - SET_80211_HDR_DURATION(pReAsocPartial, 0); - - SET_80211_HDR_ADDRESS1(pReAsocPartial, ReasocStaAddr); - SET_80211_HDR_ADDRESS2(pReAsocPartial, Adapter->CurrentAddress); - SET_80211_HDR_ADDRESS3(pReAsocPartial, ReasocStaAddr); - SET_80211_HDR_FRAGMENT_SEQUENCE(pReAsocPartial, 0); - - // TODO: Change this - SET_REASOC_REQ_CAPABILITY_INFO(pReAsocPartial, ReasocCap); - SET_REASOC_REQ_LISTEN_INTERVAL(pReAsocPartial, ReasocListenInterval); - - PlatformMoveMemory( GET_REASOC_REQ_CURR_AP_ADDR(pReAsocPartial), CurrentasocStaAddr, 6); - - //3 Size of Associate Request, can not use sizeof(AssociateReqPartial) - FillOctetString(ReAsocReq, Buffer, 0x22); - - // SSID element - PacketMakeElement(&ReAsocReq, EID_SsId, ReasocSsid); - - // Supported rates element - // PacketMakeElement(&AsocReq, EID_SupRates, Adapter->MgntInfo.SupportedRates); - FillOctetString(SuppRates, SuppRatesContent, 0); - FillOctetString(ExtSuppRates, ExtSuppRatesContent, 0); - SelectSupportedRatesElement( pMgntInfo->dot11CurrentWirelessMode, ReasocSuppRates, FALSE, &SuppRates, &ExtSuppRates ); - PacketMakeElement(&ReAsocReq, EID_SupRates, SuppRates); - - // Extended supported rates - if(ExtSuppRates.Length != 0) - { - PacketMakeElement(&ReAsocReq, EID_ExtSupRates, ExtSuppRates); - } - - if(!GET_SIMPLE_CONFIG_ENABLED(pMgntInfo)) - { - // RSNIE. 2004/07/22, kcwu. - if(pMgntInfo->SecurityInfo.AuthMode > RT_802_11AuthModeAutoSwitch) - { - //Fix WPA/WPA2 AP connect fail when wapi is support - //Modified by ylb, 20110906 - if (pMgntInfo->SecurityInfo.AuthMode == RT_802_11AuthModeWAPI || pMgntInfo->SecurityInfo.AuthMode == RT_802_11AuthModeCertificateWAPI ) - { - WAPI_SecFuncHandler(WAPI_CONSTRUCTASSOCIATEREQ, Adapter, (PVOID)&ReAsocReq, WAPI_END); - } - else if(pMgntInfo->SecurityInfo.AuthMode > RT_802_11AuthModeAutoSwitch) - { - //4 // WPA IE - if(RT_STATUS_SUCCESS != (rtStatus = - Sec_AppendWPAIE( - Adapter, // Adapter context - (CONTENT_PKT_TYPE_802_11 | CONTENT_PKT_TYPE_CLIENT), // content type - &(pMgntInfo->targetBSS), // target info - sizeof(RT_WLAN_BSS), // target info length - Adapter->MAX_TRANSMIT_BUFFER_SIZE, // Content max length capacity - &ReAsocReq // Packet Content octet string - ))) - { - RT_TRACE_F(COMP_SEC, DBG_TRACE, ("Fail (0x%08X) to append WPA IE\n", rtStatus)); - } - - //4 // RSN IE - if(RT_STATUS_SUCCESS != (rtStatus = - Sec_AppendRSNIE( - Adapter, // Adapter context - (CONTENT_PKT_TYPE_802_11 | CONTENT_PKT_TYPE_CLIENT), // content type - &(pMgntInfo->targetBSS), // target info - sizeof(RT_WLAN_BSS), // target info length - Adapter->MAX_TRANSMIT_BUFFER_SIZE, // Content max length capacity - &ReAsocReq // Packet Content octet string - ))) - { - RT_TRACE_F(COMP_SEC, DBG_TRACE, ("Fail (0x%08X) to append RSN IE\n", rtStatus)); - } - - //4 // Fast Transition MD IE - if(RT_STATUS_SUCCESS != (rtStatus = - FT_AppendMdIE( - Adapter, // Adapter context - (CONTENT_PKT_TYPE_802_11 | CONTENT_PKT_TYPE_CLIENT), // content type - &(pMgntInfo->targetBSS), // target info - sizeof(RT_WLAN_BSS), // target info length - Adapter->MAX_TRANSMIT_BUFFER_SIZE, // Content max length capacity - &ReAsocReq // Packet Content octet string - ))) - { - RT_TRACE_F(COMP_MLME, DBG_LOUD, ("Fail (0x%08X) to append MD IE\n", rtStatus)); - } - - //4 // Fast Transition FT IE - if(RT_STATUS_SUCCESS != (rtStatus = - FT_AppendFtIE( - Adapter, // Adapter context - (CONTENT_PKT_TYPE_802_11 | CONTENT_PKT_TYPE_CLIENT), // content type - &(pMgntInfo->targetBSS), // target info - sizeof(RT_WLAN_BSS), // target info length - Adapter->MAX_TRANSMIT_BUFFER_SIZE, // Content max length capacity - &ReAsocReq // Packet Content octet string - ))) - { - RT_TRACE_F(COMP_MLME, DBG_TRACE, ("Fail (0x%08X) to append FT IE\n", rtStatus)); - } - } - } - } - - // WMM-IE. Added by Annie, 2005-11-08. - if( pMgntInfo->pStaQos->CurrentQosMode>QOS_DISABLE ) - { - PacketMakeElement(&ReAsocReq, EID_Vendor, pMgntInfo->pStaQos->WMMIE); - } - - // Append CCX Aironet IE for CCXv1 S19, S13, CCXv4 S61. - CCX_AppendAironetIE(Adapter, &ReAsocReq); - - // CCX 2 S31 AP Control of Client Transmit Power (TPC). - CCX_AppendCcxCellPowerIE(Adapter, &ReAsocReq); - - // For CCX 2 S36, Radio Management Capability element, 2006.05.15, by rcnjko. - CCX_RM_AppendRmCapIE(Adapter, &ReAsocReq); - - // For CCX 2 S38, WLAN Device Version Number element. - CCX_AppendCcxVerIE(Adapter, &ReAsocReq); - - // For CCX S67 MFP - CCX_AppendCcxSFAIE(Adapter, &ReAsocReq); - - // CCKM Fast Roam , by CCW - CCX_ConstructReAssociateReq(Adapter, &ReAsocReq); - - - // Include High Throuput capability && Realtek proprietary - if( pMgntInfo->pHTInfo->bCurrentHTSupport ) - { - // - // Construct HTCapability and HTInfo IE - // - OCTET_STRING osHTCap; - RT_TRACE(COMP_HT, DBG_LOUD, ("ConstructAssociateReq(): Trying to associate to an 802.11n HT AP\n")); - FillOctetString(osHTCap, &(pMgntInfo->pHTInfo->SelfHTCap), sizeof(pMgntInfo->pHTInfo->SelfHTCap)); - HTConstructCapabilityElement(Adapter, &osHTCap, TRUE); - if(pMgntInfo->pHTInfo->ePeerHTSpecVer == HT_SPEC_VER_EWC) - PacketMakeElement(&ReAsocReq, EID_Vendor, osHTCap); - else - PacketMakeElement(&ReAsocReq, EID_HTCapability, osHTCap); - } - - if( pMgntInfo->pVHTInfo->bCurrentVHTSupport ) - { - OCTET_STRING osVHTCap; - u1Byte opmode = 0; - OCTET_STRING osVHTNotif; - CHANNEL_WIDTH opNotifBW = CHNL_GetRegBWSupport(Adapter); - u1Byte opNotifNss = pMgntInfo->pVHTInfo->nRxSPStream; - - RT_TRACE(COMP_HT, DBG_LOUD, ("ConstructAssociateReq(): Trying to associate to an 802.11ac VHT AP\n")); - FillOctetString(osVHTCap, &(pMgntInfo->pVHTInfo->SelfVHTCap), sizeof(pMgntInfo->pVHTInfo->SelfVHTCap)); - VHTConstructCapabilityElement(Adapter, &osVHTCap, TRUE); - PacketMakeElement(&ReAsocReq, EID_VHTCapability, osVHTCap); - - if(pMgntInfo->pVHTInfo->bOpModeNotif) - { - opNotifBW = pMgntInfo->pVHTInfo->BWToSwitch; - DbgPrint("pMgntInfo->pVHTInfo->bOpModeNotif = TRYE BW = %d 222\n", opNotifBW); - opNotifNss = pMgntInfo->pVHTInfo->RxSSToSwitch; - } - - RT_TRACE(COMP_HT, DBG_LOUD, ("ConstructAssociateReq(): carry operating mode notification with BW(%d) RxSS(%d)\n", opNotifBW, opNotifNss)); - FillOctetString(osVHTNotif, &opmode, sizeof(opmode)); - SET_VHT_OPERATING_MODE_FIELD_CHNL_WIDTH(&opmode, opNotifBW); - SET_VHT_OPERATING_MODE_FIELD_RX_NSS(&opmode, (opNotifNss-1)); - SET_VHT_OPERATING_MODE_FIELD_RX_NSS_TYPE(&opmode, pMgntInfo->pVHTInfo->RxSSTypeBfmeeToSwitch); - - PacketMakeElement(&ReAsocReq, EID_OpModeNotification, osVHTNotif); - } - - // - // Construct Realtek Proprietary Aggregation mode (Set AMPDU Factor to 2, 32k) - // - //2008.08.13 If connect to realtek ap, append realtek OUI for WOW - if(pMgntInfo->bRealtekAggCapExist) - { - OCTET_STRING osRealtekIEType2; - FillOctetString(osRealtekIEType2, pMgntInfo->RTIEType2Buffer, sizeof(pMgntInfo->RTIEType2Buffer)); - ConstructRTKAggElement(Adapter, &osRealtekIEType2); - PacketMakeElement(&ReAsocReq, EID_Vendor, osRealtekIEType2); - } - - - // - // Simple config IE. by CCW - copy from 818x - // - if(GET_SIMPLE_CONFIG_ENABLED(pMgntInfo)) - { - WPS_AppendElement(Adapter, &ReAsocReq, FALSE, WPS_INFO_ASOCREQ_IE); - } - - // - // CCX4 CAC -- TSPEC IE, 2006.06.26, by shien chang. - // - if (CCX_CAC_IsVoiceTsExist(Adapter)) - { - WMM_TSPEC tsVoice, tsSignal; - OCTET_STRING VoiceEle, SignalEle; - PQOS_TSTREAM pTs = NULL; - PSTA_QOS pStaQos = pMgntInfo->pStaQos; - u1Byte tidVoice = 0; - RT_DISP( FCCX, CCX_CAC, ( "VoTs exists, append Voice TSPEC Signal TSPEC in Reassoc Req\n" ) ); - - CCX_CAC_ConstructVoiceTspec(Adapter, tsVoice); - FillOctetString(VoiceEle, &tsVoice[2], TSPEC_SIZE - 2); - PacketMakeElement( &ReAsocReq, EID_Vendor, VoiceEle ); - - CCX_CAC_ConstructSignalTspec(Adapter, tsSignal); - FillOctetString(SignalEle, &tsSignal[2], TSPEC_SIZE - 2); - PacketMakeElement( &ReAsocReq, EID_Vendor, SignalEle ); - - // TSRS IE - pTs = &(pStaQos->StaTsArray[tidVoice]); - if (QOS_RATE_TO_BPS( QosGetNPR(Adapter, pTs) ) >= - GET_TSPEC_MIN_PHY_RATE(pTs->OutStandingTSpec) ) - { - RT_DISP( FCCX, CCX_CAC, ( "Append TSRS in Reassoc Req\n" ) ); - QosConstructTSRS(Adapter, pTs, &ReAsocReq); - } - } - -#if (P2P_SUPPORT == 1) - P2P_Append_AssociationReqIe(&ReAsocReq, Adapter); -#endif - - WFD_AppendAssocReqIEs(Adapter, Adapter->MAX_TRANSMIT_BUFFER_SIZE, &ReAsocReq); - - WriteEF4Byte(pLength, ReAsocReq.Length); - - RT_TRACE(COMP_MLME, DBG_LOUD, ("<=== ConstructReAssociateReq()\n")); -} - -// -// Description: Construct a Association Response packet. -// 2005.06.02, by rcnjko. -// -VOID -ConstructAssociateRsp( - PADAPTER Adapter, - pu1Byte Buffer, - pu4Byte pLength, - pu1Byte asocStaAddr, - u2Byte asocCap, - u2Byte asocStatusCode, - u2Byte asocID, - BOOLEAN bReAssocRsp, - BOOLEAN bQosSTA - ) -{ - PMGNT_INFO pMgntInfo = &Adapter->MgntInfo; - OCTET_STRING AsocRsp; - BOOLEAN bFilterCck = FALSE; - pu1Byte pAsocRspPartial; - OCTET_STRING SuppRates; - u1Byte SuppRatesContent[8]; // NOTE! Length of Support Rates <= 8. - OCTET_STRING ExtSuppRates; - u1Byte ExtSuppRatesContent[255]; // NOTE! Length of Extended Support Rates <= 255. - - pAsocRspPartial = Buffer; - - //------------------------------------------------------------------------- - // MAC Header. - //------------------------------------------------------------------------- - // Frame Control. - SET_80211_HDR_FRAME_CONTROL(pAsocRspPartial, 0); - SET_80211_HDR_TYPE_AND_SUBTYPE(pAsocRspPartial, (bReAssocRsp ? Type_Reasoc_Rsp : Type_Asoc_Rsp)); - SET_80211_HDR_DURATION(pAsocRspPartial, 0); - - // Addresses (DA/SA/BSSID). - SET_80211_HDR_ADDRESS1(pAsocRspPartial, asocStaAddr); - SET_80211_HDR_ADDRESS2(pAsocRspPartial, Adapter->CurrentAddress); - SET_80211_HDR_ADDRESS3(pAsocRspPartial, pMgntInfo->Bssid); - - // Sequence Control. - SET_80211_HDR_FRAGMENT_SEQUENCE(pAsocRspPartial, 0); - - //------------------------------------------------------------------------- - // Frame Body. - //------------------------------------------------------------------------- - // Capability information. - SET_ASOC_RSP_CAPABILITY_INFO(pAsocRspPartial, asocCap); - - // Status Code. - SET_ASOC_RSP_STATUS_CODE(pAsocRspPartial, asocStatusCode); - - // AID. - SET_ASOC_RSP_AID(pAsocRspPartial, (asocID | 0xC000) ); - - // Size of this Frame until last fixed size field. - AsocRsp.Length = 30; - AsocRsp.Octet = Buffer; - - // Supported rates element. - FillOctetString(SuppRates, SuppRatesContent, 0); - FillOctetString(ExtSuppRates, ExtSuppRatesContent, 0); - - P2P_FilerCck(Adapter, &bFilterCck); - - SelectSupportedRatesElement( pMgntInfo->dot11CurrentWirelessMode, pMgntInfo->dot11OperationalRateSet, bFilterCck, &SuppRates, &ExtSuppRates ); - PacketMakeElement(&AsocRsp, EID_SupRates, SuppRates); - - // Wireless mode dependent elements. - if( IS_WIRELESS_OFDM_24G(Adapter)) - { - // Extended Supported Rates. - if(ExtSuppRates.Length != 0) - { - PacketMakeElement(&AsocRsp, EID_ExtSupRates, ExtSuppRates); - } - } - - if(bQosSTA) - { - Ap_AppendWmmIe(Adapter, &AsocRsp); - } - - // Include High Throuput capability and High Throuput info, Guangan add this for 40MHz ap mode. - if(IS_WIRELESS_MODE_N(Adapter)) - { - OCTET_STRING osHTCap, osHTInfo; - FillOctetString(osHTCap, &(pMgntInfo->pHTInfo->SelfHTCap), sizeof(pMgntInfo->pHTInfo->SelfHTCap)); - FillOctetString(osHTInfo, &(pMgntInfo->pHTInfo->SelfHTInfo), sizeof(pMgntInfo->pHTInfo->SelfHTInfo)); - HTConstructCapabilityElement(Adapter, &osHTCap, TRUE); - HTConstructInfoElement(Adapter, &osHTInfo); - - // TODO: Construct CAP info element here - PacketMakeElement(&AsocRsp, EID_HTCapability, osHTCap); - PacketMakeElement(&AsocRsp, EID_HTInfo, osHTInfo); - } - - if(IS_WIRELESS_MODE_AC(Adapter)) - { - OCTET_STRING osVHTCap, osVHTOperation; - FillOctetString(osVHTCap, &(pMgntInfo->pVHTInfo->SelfVHTCap), sizeof(pMgntInfo->pVHTInfo->SelfVHTCap)); - FillOctetString(osVHTOperation, &(pMgntInfo->pVHTInfo->SelfVHTInfo), sizeof(pMgntInfo->pVHTInfo->SelfVHTInfo)); - VHTConstructCapabilityElement(Adapter, &osVHTCap, TRUE); - VHTConstructOperationElement(Adapter, &osVHTOperation); - - // TODO: Construct CAP info element here - PacketMakeElement(&AsocRsp, EID_VHTCapability, osVHTCap); - PacketMakeElement(&AsocRsp, EID_VHTOperation, osVHTOperation); - } - - if(ACTING_AS_AP(Adapter)) - { - // - // Append IE for AsocRsp from OS. - // - PRT_WLAN_STA pEntry = AsocEntry_GetEntry(pMgntInfo, asocStaAddr); - - if(pEntry) - { - OCTET_STRING asocReqIe = {NULL, 0}; - OCTET_STRING wpsIe = {NULL, 0}; - - if(pEntry->AP_AsocRspIEFromOSLength > 0&& - pEntry->AP_AsocRspIEFromOS != NULL && - AsocRsp.Length + pEntry->AP_AsocRspIEFromOSLength <= sMaxMpduLng) - { - OCTET_STRING osAsocRspIEFromOS; - osAsocRspIEFromOS.Length = (u2Byte)pEntry->AP_AsocRspIEFromOSLength; - osAsocRspIEFromOS.Octet = pEntry->AP_AsocRspIEFromOS; - AppendAdditionalIEs(&AsocRsp, osAsocRspIEFromOS); - } - - if(pEntry->AP_RecvAsocReqLength) // for WDI this is 0 - { - FillOctetString(asocReqIe, pEntry->AP_RecvAsocReq, (u2Byte)pEntry->AP_RecvAsocReqLength); - wpsIe = PacketGetElement(asocReqIe, EID_Vendor, OUI_SUB_SimpleConfig, OUI_SUBTYPE_DONT_CARE); - if(wpsIe.Length > 0) - { - WPS_AppendElement(Adapter, &AsocRsp, TRUE, WPS_INFO_ASOCRSP_IE); - } - } - } - } - -#if (P2P_SUPPORT == 1) - P2P_Append_AssociationRspIe(&AsocRsp, Adapter); -#endif - - WFD_AppendAssocRspIEs(Adapter, Adapter->MAX_TRANSMIT_BUFFER_SIZE, &AsocRsp); - - WriteEF4Byte(pLength, AsocRsp.Length); -} - - -VOID -ConstructDeauthenticatePacket( - PADAPTER Adapter, - pu1Byte Buffer, - pu4Byte pLength, - pu1Byte auSta, - u1Byte asRsn -) -{ - pu1Byte pdeauth; - OCTET_STRING Deauth; - PMGNT_INFO pMgntInfo = &Adapter->MgntInfo; - PRT_SECURITY_T pSecInfo = &(pMgntInfo->SecurityInfo); - - pdeauth = Buffer; - - SET_80211_HDR_FRAME_CONTROL(pdeauth, 0); - SET_80211_HDR_TYPE_AND_SUBTYPE(pdeauth, Type_Deauth); - SET_80211_HDR_DURATION(pdeauth, 0); - - SET_80211_HDR_ADDRESS1(pdeauth, auSta); - SET_80211_HDR_ADDRESS2(pdeauth, Adapter->CurrentAddress); - SET_80211_HDR_ADDRESS3(pdeauth, Adapter->MgntInfo.Bssid); - SET_80211_HDR_FRAGMENT_SEQUENCE(pdeauth, 0); - - // Size of this Frame until last fixed size field. - Deauth.Octet = Buffer; - Deauth.Length = sMacHdrLng; - - //------------------------------------------------------------------------- - // Security Header: leave space for it if necessary. - //------------------------------------------------------------------------- - CCX_ConstructDeauthenticatePacket(Adapter, pdeauth, &Deauth); - - if( pMgntInfo->bInBIPMFPMode ) - { - if( pSecInfo->PairwiseEncAlgorithm == RT_ENC_ALG_AESCCMP && // Now we just support AES MFP !! - !(MacAddr_isBcst(auSta) )) - { - // Set WEP bit !! - SET_80211_HDR_WEP( pdeauth , 1 ); - - if(pSecInfo->EncryptionHeadOverhead > 0) - { - PlatformZeroMemory( ( Deauth.Octet+ Deauth.Length ) , pSecInfo->EncryptionHeadOverhead); - Deauth.Length += pSecInfo->EncryptionHeadOverhead; - } - } - } - - // Add reason code - WriteEF2Byte( ( Deauth.Octet+ Deauth.Length ) , asRsn ); - Deauth.Length += 2; - - // - // if need, Append MHDRIE - // - CCX_AppendMHDRIE( Adapter, &Deauth ); - - if( pMgntInfo->bInBIPMFPMode && (MacAddr_isBcst(auSta))) - { - SecAppenMMIE( Adapter, &Deauth ); - } - - *pLength = Deauth.Length; -} - - - - -VOID -ConstructDisassociatePacket( - PADAPTER Adapter, - pu1Byte Buffer, - pu4Byte pLength, - pu1Byte asSta, - u1Byte asRsn -) -{ - pu1Byte pdisassoc; - OCTET_STRING Disas; - PMGNT_INFO pMgntInfo = &Adapter->MgntInfo; - PRT_SECURITY_T pSecInfo = &(pMgntInfo->SecurityInfo); - - pdisassoc = Buffer; - - SET_80211_HDR_FRAME_CONTROL(pdisassoc, 0); - SET_80211_HDR_TYPE_AND_SUBTYPE(pdisassoc, Type_Disasoc); - SET_80211_HDR_DURATION(pdisassoc, 0); - - SET_80211_HDR_ADDRESS1(pdisassoc, asSta); - SET_80211_HDR_ADDRESS2(pdisassoc, Adapter->CurrentAddress); - SET_80211_HDR_ADDRESS3(pdisassoc, Adapter->MgntInfo.Bssid); - SET_80211_HDR_FRAGMENT_SEQUENCE(pdisassoc, 0); - - // Size of this Frame until last fixed size field. - Disas.Octet = Buffer; - Disas.Length = sMacHdrLng; - - //------------------------------------------------------------------------- - // Security Header: leave space for it if necessary. - //------------------------------------------------------------------------- - CCX_ConstructDisassociatePacket(Adapter, pdisassoc, &Disas); - - if( pMgntInfo->bInBIPMFPMode ) - { - if( pSecInfo->PairwiseEncAlgorithm == RT_ENC_ALG_AESCCMP && // Now we just support AES MFP !! - !(MacAddr_isBcst(asSta) )) - { - // Set WEP bit !! - SET_80211_HDR_WEP( pdisassoc , 1 ); - - if(pSecInfo->EncryptionHeadOverhead > 0) - { - PlatformZeroMemory( ( Disas.Octet+ Disas.Length ) , pSecInfo->EncryptionHeadOverhead); - Disas.Length += pSecInfo->EncryptionHeadOverhead; - } - } - - - } - - // Add reason code - WriteEF2Byte( ( Disas.Octet+ Disas.Length ) , asRsn ); - Disas.Length += 2; - - // - // if need, Append MHDRIE - // - CCX_AppendMHDRIE( Adapter, &Disas ); - - if( pMgntInfo->bInBIPMFPMode && (MacAddr_isBcst(asSta))) - { - SecAppenMMIE( Adapter, &Disas ); - } - - *pLength = Disas.Length; -} - -// -// Description: -// Construct a Probe Response packet. -// Arguments: -// [in] Adapter - -// The adapter context. -// [in] Buffer - -// The buffer for the constructed probe response. -// [out] pLength - -// Return the length in byte for the constructed probe response. -// [in] StaAddr - -// The target mac address. -// [in] bHideSSID - -// Hide our SSID in the SSID element. -// [in[ pRfdProbeReq - -// The RFD contains the probe request. This field may be NULL. -// [in] posProbeReq - -// The location of OCTET_STRING for the probe request. This filed may be NULL if no probe request -// is input. -// Return: -// None -// Remark: -// This construction function may check the probe request content and deside if some information should be -// included in the probe response. -// The input RFD pRfdProbeReq and posProbeReq may be NULL. In such case, this function only sends the -// default content of probe response. -// 2004.10.07, by rcnjko. -// Revised by Bruce, 2012-06-08. -// -VOID -ConstructProbeRsp( - IN PADAPTER Adapter, - IN pu1Byte Buffer, - IN pu4Byte pLength, - IN pu1Byte StaAddr, - IN BOOLEAN bHideSSID, - IN PRT_RFD pRfdProbeReq, - IN POCTET_STRING posProbeReq - ) -{ - PMGNT_INFO pMgntInfo; - pu1Byte pProbeRsp; - OCTET_STRING ProbeRspFrame; - u8Byte TimeStamp; - OCTET_STRING DSParms; - OCTET_STRING IBSSParms; - OCTET_STRING SuppRates; - u1Byte SuppRatesContent[8]; // NOTE! Length of Support Rates <= 8. - OCTET_STRING ExtSuppRates; - u1Byte ExtSuppRatesContent[255]; // NOTE! Length of Extended Support Rates <= 255. - OCTET_STRING ERPInfo; - u1Byte ERPInfoContent[1]; - - OCTET_STRING IbssAdditionalIEs; - OCTET_STRING osEDCAInfoElem; - u1Byte EDCAInfo[1]; - BOOLEAN bFilterCck = FALSE; - PMGNT_INFO pDefaultMgntInfo; - - pMgntInfo = &Adapter->MgntInfo; - pProbeRsp = Buffer; - - //------------------------------------------------------------------------- - // MAC Header. - //------------------------------------------------------------------------- - // Frame Control. - SET_80211_HDR_FRAME_CONTROL(pProbeRsp, 0); - SET_80211_HDR_TYPE_AND_SUBTYPE(pProbeRsp, Type_Probe_Rsp); - SET_80211_HDR_DURATION(pProbeRsp, 0); - - // Addresses (DA/SA/BSSID). - SET_80211_HDR_ADDRESS1(pProbeRsp, StaAddr); - SET_80211_HDR_ADDRESS2(pProbeRsp, Adapter->CurrentAddress); - SET_80211_HDR_ADDRESS3(pProbeRsp, Adapter->MgntInfo.Bssid); - - // Sequence Control. - SET_80211_HDR_FRAGMENT_SEQUENCE(pProbeRsp, 0); - - - //------------------------------------------------------------------------- - // Frame Body. - //------------------------------------------------------------------------- - // Timestamp. - // <RJ_TODO> I think this is not necessary, becuase our hw should fill timestamp. - TimeStamp = PlatformGetCurrentTime(); - SET_BEACON_PROBE_RSP_TIME_STAMP_LOW(pProbeRsp, (u4Byte)(TimeStamp&0xffffffff)); - SET_BEACON_PROBE_RSP_TIME_STAMP_HIGH(pProbeRsp, (u4Byte)(TimeStamp >> 32)); - - // Beacon interval. - SET_BEACON_PROBE_RSP_BEACON_INTERVAL(pProbeRsp, pMgntInfo->dot11BeaconPeriod ); - - // Capability information. - if( ACTING_AS_AP(Adapter) ) - { - SET_BEACON_PROBE_RSP_CAPABILITY_INFO(pProbeRsp, (pMgntInfo->mCap & ~cIBSS) ); - } - else - { - SET_BEACON_PROBE_RSP_CAPABILITY_INFO(pProbeRsp, (pMgntInfo->mCap & ~cESS) ); - } - - if( pMgntInfo->SecurityInfo.PairwiseEncAlgorithm!= RT_ENC_ALG_NO_CIPHER ) - { - UNION_BEACON_PROBE_RSP_CAPABILITY_INFO(pProbeRsp, cPrivacy); - } - else - { - MASK_BEACON_PROBE_RSP_CAPABILITY_INFO(pProbeRsp, cPrivacy); - } - - // Size of this Frame until last fixed size field. - ProbeRspFrame.Length = 36; - ProbeRspFrame.Octet = Buffer; - - // SSID. - if( bHideSSID && pMgntInfo->bHiddenSSID ) - { - u1Byte NullSSID[1]; - OCTET_STRING HiddenSSID; - FillOctetString(HiddenSSID, NullSSID, 0); - PacketMakeElement(&ProbeRspFrame, EID_SsId, HiddenSSID); - } - else - { - PacketMakeElement(&ProbeRspFrame, EID_SsId, Adapter->MgntInfo.Ssid); - } - - // Supported rate. - FillOctetString(SuppRates, SuppRatesContent, 0); - FillOctetString(ExtSuppRates, ExtSuppRatesContent, 0); - - P2P_FilerCck(Adapter, &bFilterCck); - - // Set supported and extended supported rate according to Wirelessmode and dot11OperationalRateSet. - SelectSupportedRatesElement( pMgntInfo->dot11CurrentWirelessMode, pMgntInfo->dot11OperationalRateSet, bFilterCck, &SuppRates, &ExtSuppRates ); - PacketMakeElement(&ProbeRspFrame, EID_SupRates, SuppRates); - - // DS parameters element. - DSParms.Octet = &pMgntInfo->dot11CurrentChannelNumber; - DSParms.Length = 1; - PacketMakeElement(&ProbeRspFrame, EID_DSParms, DSParms); - - RT_TRACE(COMP_AP, DBG_TRACE, ("Constructure Probe RSP Mediaconnect %d dot11CurrentChannel %d, dot11CurrentWirelessMode=%x\n", - pMgntInfo->bMediaConnect,pMgntInfo->dot11CurrentChannelNumber,pMgntInfo->dot11CurrentWirelessMode)); - - // Ibss or TIM element. - if( !ACTING_AS_AP(Adapter)){ - IBSSParms.Octet = (pu1Byte)(&pMgntInfo->mIbssParms.atimWin); - IBSSParms.Length = 2; - PacketMakeElement(&ProbeRspFrame, EID_IbssParms, IBSSParms); - } - - //2004/07/22, kcwu, construct Security IE - //2004/09/15, kcwu, decide to construct which kind of element,WPA or WPA2 - if(pMgntInfo->SecurityInfo.AuthMode > RT_802_11AuthModeAutoSwitch) - { - PacketMakeElement(&ProbeRspFrame, (pMgntInfo->SecurityInfo.SecLvl == RT_SEC_LVL_WPA)?EID_Vendor:EID_WPA2, pMgntInfo->SecurityInfo.RSNIE); - } - - // Wireless mode dependent elements. - if( IS_WIRELESS_OFDM_24G(Adapter)) - { - // Capability. - if(ACTING_AS_IBSS(Adapter) == FALSE) - UNION_BEACON_PROBE_RSP_CAPABILITY_INFO(pProbeRsp, cShortSlotTime); - - if( IS_WIRELESS_MODE_G(Adapter) || - (IS_WIRELESS_MODE_HT_24G(Adapter) && pMgntInfo->pHTInfo->bCurSuppCCK)) - { - ERPInfoContent[0] = 0; - if(pMgntInfo->bUseProtection) - ERPInfoContent[0] |= ERP_UseProtection; - - FillOctetString(ERPInfo, ERPInfoContent, 1); - PacketMakeElement(&ProbeRspFrame, EID_ERPInfo, ERPInfo); - } - - // Extended Supported Rates. - if(ExtSuppRates.Length != 0) - { - PacketMakeElement(&ProbeRspFrame, EID_ExtSupRates, ExtSuppRates); - } - } - - // - // Append Additional IEs from Ndis6, for DTM Vista 1.0c premium logo test. By Bruce, 2007-08-13. - // - if(ACTING_AS_IBSS(Adapter)) - { - GetIbssAdditionalData(Adapter, &IbssAdditionalIEs); - if(IbssAdditionalIEs.Octet != NULL && IbssAdditionalIEs.Length != 0) - { - AppendAdditionalIEs(&ProbeRspFrame, IbssAdditionalIEs); - } - - if(pMgntInfo->pStaQos->QosCapability != QOS_DISABLE) - { - FillOctetString(osEDCAInfoElem, EDCAInfo, 1); - PlatformZeroMemory(osEDCAInfoElem.Octet, 1); - AppendQoSElement(&ProbeRspFrame, &osEDCAInfoElem, OUI_SUBTYPE_WMM_INFO); - } - } - - // - // Append additional IEs. By haich, 2008.08.01. - // - if(ACTING_AS_AP(Adapter)) - { - if(pMgntInfo->AdditionalResponseIESize> 0&& - pMgntInfo->AdditionalResponseIEData!= NULL && - ProbeRspFrame.Length + pMgntInfo->AdditionalResponseIESize <= sMaxMpduLng) - { - OCTET_STRING osAdditionalProbeRspIEs; - osAdditionalProbeRspIEs.Length = (u2Byte)pMgntInfo->AdditionalResponseIESize; - osAdditionalProbeRspIEs.Octet = (pu1Byte)pMgntInfo->AdditionalResponseIEData; - AppendAdditionalIEs(&ProbeRspFrame, osAdditionalProbeRspIEs); - } - Ap_AppendWmmIe(Adapter, &ProbeRspFrame); - Ap_AppendCountryIE(Adapter, &ProbeRspFrame); - Ap_AppendPowerConstraintIE(Adapter, &ProbeRspFrame); - } - - // - // Include High Throuput capability and High Throuput info - // - Do not include HT if CurrentWirelessMode is less than N mode even if hardware support it - // - if(IS_WIRELESS_MODE_N(Adapter)) - { - OCTET_STRING osHTCap, osHTInfo; - - FillOctetString(osHTCap, &(pMgntInfo->pHTInfo->SelfHTCap), sizeof(pMgntInfo->pHTInfo->SelfHTCap)); - FillOctetString(osHTInfo, &(pMgntInfo->pHTInfo->SelfHTInfo), sizeof(pMgntInfo->pHTInfo->SelfHTInfo)); - HTConstructCapabilityElement(Adapter, &osHTCap, FALSE); - HTConstructInfoElement(Adapter, &osHTInfo); - - // TODO: Construct CAP info element here - PacketMakeElement(&ProbeRspFrame, EID_HTCapability, osHTCap); - PacketMakeElement(&ProbeRspFrame, EID_HTInfo, osHTInfo); - } - - // - // Construct Realtek Proprietary Aggregation mode (Set AMPDU Factor to 2, 32k) - // - { - OCTET_STRING osRealtekIEType2; - FillOctetString(osRealtekIEType2, pMgntInfo->RTIEType2Buffer, sizeof(pMgntInfo->RTIEType2Buffer)); - ConstructRTKAggElement(Adapter, &osRealtekIEType2); - PacketMakeElement(&ProbeRspFrame, EID_Vendor, osRealtekIEType2); - } - - if(IS_WIRELESS_MODE_AC(Adapter)) - { - OCTET_STRING osVHTCap, osVHTOperation; - - FillOctetString(osVHTCap, &(pMgntInfo->pVHTInfo->SelfVHTCap), sizeof(pMgntInfo->pVHTInfo->SelfVHTCap)); - FillOctetString(osVHTOperation, &(pMgntInfo->pVHTInfo->SelfVHTInfo), sizeof(pMgntInfo->pVHTInfo->SelfVHTInfo)); - VHTConstructCapabilityElement(Adapter, &osVHTCap, FALSE); - VHTConstructOperationElement(Adapter, &osVHTOperation); - - // TODO: Construct CAP & Operation element here - PacketMakeElement(&ProbeRspFrame, EID_VHTCapability, osVHTCap); - PacketMakeElement(&ProbeRspFrame, EID_VHTOperation, osVHTOperation); - } - - WAPI_SecFuncHandler(WAPI_CONSTRUCTPROBERSP, Adapter, (PVOID)&ProbeRspFrame, WAPI_END); - - // - // Simple config IE. by CCW - copy from 818x - // - pDefaultMgntInfo = &(GetDefaultAdapter(Adapter)->MgntInfo); - if(GET_SIMPLE_CONFIG_IE_LEN(pDefaultMgntInfo) > 0) - { - RT_TRACE(COMP_WPS, DBG_TRACE, ("AP Construct Probe Response \n")); - WPS_AppendElement(GetDefaultAdapter(Adapter), &ProbeRspFrame, FALSE, WPS_INFO_PROBERSP_IE); - } - -#if (P2P_SUPPORT == 1) - P2P_Append_GoProbeRspIe(&ProbeRspFrame, Adapter, Type_Probe_Rsp, pRfdProbeReq, posProbeReq); -#endif - - WFD_AppendProbeRspIEs(Adapter, Adapter->MAX_TRANSMIT_BUFFER_SIZE, &ProbeRspFrame, pRfdProbeReq, posProbeReq); - - *pLength = ProbeRspFrame.Length; -} - -// -// Description: Construct a customized Data frame. -// 2004.12.05, by rcnjko. -// -VOID -ConstructCustomizedData( - PADAPTER Adapter, - pu1Byte Buffer, - pu4Byte pLength, - u2Byte pktLength -) -{ - PMGNT_INFO pMgntInfo; - pu1Byte pHeader; - - pMgntInfo = &Adapter->MgntInfo; - pHeader = Buffer; - - SET_80211_HDR_FRAME_CONTROL(pHeader, 0); - SET_80211_HDR_TYPE_AND_SUBTYPE(pHeader, Type_Data); - SET_80211_HDR_PWR_MGNT(pHeader, 0); - - SET_80211_HDR_TO_DS(pHeader, 1); - SET_80211_HDR_ADDRESS1(pHeader, pMgntInfo->Bssid); - SET_80211_HDR_ADDRESS2(pHeader, Adapter->CurrentAddress); - SET_80211_HDR_ADDRESS3(pHeader, pMgntInfo->Bssid); - - SET_80211_HDR_DURATION(pHeader, 0); - SET_80211_HDR_FRAGMENT_SEQUENCE(pHeader, 0); - - *pLength = 24 + (u4Byte)pktLength; -} - - -// -// Description: Construct a customized Data frame. -// 2005.03.23, by rcnjko. -// -VOID -ConstructNullFunctionData( - IN PADAPTER Adapter, - IN pu1Byte Buffer, - IN pu4Byte pLength, - IN pu1Byte StaAddr, - IN BOOLEAN bQoS, - IN u1Byte AC, - IN BOOLEAN bEosp, - IN BOOLEAN bForcePowerSave - ) -{ - PMGNT_INFO pMgntInfo; - pu1Byte pHeader; - - pMgntInfo = &Adapter->MgntInfo; - pHeader = Buffer; - - // [APSD] QoS Null Function Data , 2006-06-22, by Isaiah - SET_80211_HDR_FRAME_CONTROL(pHeader, 0); - SET_80211_HDR_TYPE_AND_SUBTYPE(pHeader, ( (bQoS) ? Type_QosNull: Type_Null_Frame) ); - SET_80211_HDR_PWR_MGNT(pHeader, (bForcePowerSave) ? 1 : 0 ); - - switch(pMgntInfo->OpMode) - { - case RT_OP_MODE_INFRASTRUCTURE: // 1,0 - SET_80211_HDR_TO_DS(pHeader, 1); - SET_80211_HDR_ADDRESS1(pHeader, pMgntInfo->Bssid); - SET_80211_HDR_ADDRESS2(pHeader, Adapter->CurrentAddress); - SET_80211_HDR_ADDRESS3(pHeader, StaAddr); - break; - case RT_OP_MODE_AP: // 0,1 - SET_80211_HDR_FROM_DS(pHeader, 1); - SET_80211_HDR_ADDRESS1(pHeader, StaAddr); - SET_80211_HDR_ADDRESS2(pHeader, pMgntInfo->Bssid); - SET_80211_HDR_ADDRESS3(pHeader, Adapter->CurrentAddress); - break; - case RT_OP_MODE_IBSS: // 0,0 - default: - // Handle it as IBSS, 2004.08.21, by rcnjko. - SET_80211_HDR_ADDRESS1(pHeader, StaAddr ); - SET_80211_HDR_ADDRESS2(pHeader, Adapter->CurrentAddress); - SET_80211_HDR_ADDRESS3(pHeader, pMgntInfo->Bssid ); - break; - } - SET_80211_HDR_DURATION(pHeader, 0); - SET_80211_HDR_FRAGMENT_SEQUENCE(pHeader, 0); - - if(bQoS) //[APSD] Isaiah for QoSNullFunc 2006-07-31 - { - SET_QOS_CTRL(pHeader, 0); - SET_QOS_CTRL_WMM_UP(pHeader, AC); - SET_QOS_CTRL_WMM_EOSP(pHeader, bEosp ? 1 : 0); - *pLength = 26; - } - else - *pLength = 24; -} - -VOID -ConstructBtNullFunctionData( - IN PADAPTER Adapter, - IN pu1Byte Buffer, - IN pu4Byte pLength, - IN pu1Byte StaAddr, - IN BOOLEAN bQoS, - IN u1Byte AC, - IN BOOLEAN bEosp, - IN BOOLEAN bForcePowerSave - ) -{ - PMGNT_INFO pMgntInfo; - pu1Byte pHeader; - - pMgntInfo = &Adapter->MgntInfo; - pHeader = Buffer; - - // [APSD] QoS Null Function Data , 2006-06-22, by Isaiah - SET_80211_HDR_FRAME_CONTROL(pHeader, 0); - SET_80211_HDR_TYPE_AND_SUBTYPE(pHeader, ( (bQoS) ? Type_QosNull: Type_Null_Frame) ); - SET_80211_HDR_PWR_MGNT(pHeader, (bForcePowerSave) ? 1 : 0 ); - - SET_80211_HDR_FROM_DS(pHeader, 1); - SET_80211_HDR_ADDRESS1(pHeader, StaAddr); - SET_80211_HDR_ADDRESS2(pHeader, Adapter->CurrentAddress); - SET_80211_HDR_ADDRESS3(pHeader, Adapter->CurrentAddress); -#if 0 - switch(pMgntInfo->OpMode) - { - case RT_OP_MODE_INFRASTRUCTURE: // 1,0 - SET_80211_HDR_TO_DS(pHeader, 1); - SET_80211_HDR_ADDRESS1(pHeader, pMgntInfo->Bssid); - SET_80211_HDR_ADDRESS2(pHeader, Adapter->CurrentAddress); - SET_80211_HDR_ADDRESS3(pHeader, StaAddr); - break; - case RT_OP_MODE_AP: // 0,1 - SET_80211_HDR_FROM_DS(pHeader, 1); - SET_80211_HDR_ADDRESS1(pHeader, StaAddr); - SET_80211_HDR_ADDRESS2(pHeader, Adapter->CurrentAddress); - SET_80211_HDR_ADDRESS3(pHeader, Adapter->CurrentAddress); - break; - case RT_OP_MODE_IBSS: // 0,0 - default: - // Handle it as IBSS, 2004.08.21, by rcnjko. - SET_80211_HDR_ADDRESS1(pHeader, StaAddr ); - SET_80211_HDR_ADDRESS2(pHeader, Adapter->CurrentAddress); - SET_80211_HDR_ADDRESS3(pHeader, pMgntInfo->Bssid ); - break; - } -#endif - SET_80211_HDR_DURATION(pHeader, 0); - SET_80211_HDR_FRAGMENT_SEQUENCE(pHeader, 0); - - if(bQoS) //[APSD] Isaiah for QoSNullFunc 2006-07-31 - { - SET_QOS_CTRL(pHeader, 0); - SET_QOS_CTRL_WMM_UP(pHeader, AC); - SET_QOS_CTRL_WMM_EOSP(pHeader, bEosp ? 1 : 0); - *pLength = 26; - } - else - *pLength = 24; -} - - -// -// Description: Construct a PS-Poll frame. -// 2005.02.15, by rcnjko. -// -VOID -ConstructPSPoll( - PADAPTER Adapter, - pu1Byte Buffer, - pu4Byte pLength -) -{ - pu1Byte pPSPoll; - PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); - - pPSPoll = Buffer; - - // Frame control. - SET_80211_HDR_FRAME_CONTROL(pPSPoll, 0); - SET_80211_HDR_TYPE_AND_SUBTYPE(pPSPoll, Type_PS_poll); - SET_80211_HDR_PWR_MGNT(pPSPoll, 1); - - // AID. - SET_80211_PS_POLL_AID(pPSPoll, (pMgntInfo->mAId | 0xc000) ); - - - // BSSID. - SET_80211_PS_POLL_BSSID(pPSPoll, pMgntInfo->Bssid ); - - // TA. - SET_80211_PS_POLL_TA(pPSPoll, Adapter->CurrentAddress); - - *pLength = 16; -} - -// -// Description: Construct a magic packet. -// 2005.10.20, by rcnjko. -// -VOID -ConstructMagicPacket( - PADAPTER Adapter, - pu1Byte Buffer, - pu4Byte pLength, - pu1Byte StaAddr -) -{ - PMGNT_INFO pMgntInfo; - pu1Byte pHeader; - int i; - - pMgntInfo = &Adapter->MgntInfo; - pHeader = Buffer; - - SET_80211_HDR_FRAME_CONTROL(pHeader, 0); - SET_80211_HDR_TYPE_AND_SUBTYPE(pHeader, Type_Data); - - switch(pMgntInfo->OpMode) - { - case RT_OP_MODE_INFRASTRUCTURE: // 1,0 - SET_80211_HDR_TO_DS(pHeader, 1); - SET_80211_HDR_ADDRESS1(pHeader, pMgntInfo->Bssid); - - // Old: - //PlatformMoveMemory( pHeader->Addr2, Adapter->CurrentAddress, 6 ); // SA - // New: Suggested by WCChu for 8187 wake up by unicast probereq: 2005.10.20, by rcnjko: - SET_80211_HDR_ADDRESS2(pHeader, StaAddr); // SA - - SET_80211_HDR_ADDRESS3(pHeader, StaAddr);// DA - break; - - case RT_OP_MODE_AP: // 0,1 - SET_80211_HDR_FROM_DS(pHeader, 1); - SET_80211_HDR_ADDRESS1(pHeader, StaAddr); - - // Old: - //PlatformMoveMemory( pHeader->Addr2, pMgntInfo->Bssid, 6 ); // BSSID - // New: Suggested by WCChu for 8187 wake up by unicast probereq: 2005.10.20, by rcnjko: - SET_80211_HDR_ADDRESS2(pHeader, StaAddr);// BSSID - - SET_80211_HDR_ADDRESS3(pHeader, Adapter->CurrentAddress); // SA - break; - - case RT_OP_MODE_IBSS: // 0,0 - default: - // Handle it as IBSS, 2004.08.21, by rcnjko. - SET_80211_HDR_ADDRESS1(pHeader, StaAddr); // DA - - // Old: - //PlatformMoveMemory( pHeader->Addr2, Adapter->CurrentAddress, 6 ); // SA - // New: Suggested by WCChu for 8187 wake up by unicast probereq: 2005.10.20, by rcnjko: - SET_80211_HDR_ADDRESS2(pHeader, StaAddr); // SA - - SET_80211_HDR_ADDRESS3(pHeader, pMgntInfo->Bssid); // BSSID - break; - } - SET_80211_HDR_DURATION(pHeader, 0); - SET_80211_HDR_FRAGMENT_SEQUENCE(pHeader, 0); - - // Set STA addr as Addr1. - SET_80211_HDR_ADDRESS1(pHeader, StaAddr); - // FF FF FF FF FF FF. - for(i = 0; i < 6; i++) - { - Buffer[sMacHdrLng+i] = 0xFF; - } - // Repeat STA addr 16 times. - for(i = 0; i < 16; i++) - { - PlatformMoveMemory( Buffer+sMacHdrLng+6+i*6, StaAddr, 6 ); // BSSID. - } - *pLength = sMacHdrLng + 6 + 6*16; -} - -// -// Description: Construct an EAPOL-Key packet. -// 2005.07.01, by rcnjko. -// -VOID -ConstructEapolKeyPacket( - PADAPTER Adapter, - pu1Byte Buffer, - pu4Byte pLength, - pu1Byte StaAddr, - - pu1Byte pKCK, // Pointer to KCK (EAPOL-Key Confirmation Key). - pu1Byte pKEK, // Pointer to KEK (EAPOL-Key Encryption Key). - - KeyType eKeyType, // EAPOL-Key Information field: Key Type bit: type_Group or type_Pairwise. - BOOLEAN bInstall, // EAPOL-Key Information field: Install Flag. - BOOLEAN bKeyAck, // EAPOL-Key Information field: Key Ack bit. - BOOLEAN bKeyMIC, // EAPOL-Key Information field: Key MIC bit. If true, we will calculate EAPOL MIC and fill it into Key MIC field. - BOOLEAN bSecure, // EAPOL-Key Information field: Secure bit. - BOOLEAN bError, // EAPOL-Key Information field: Error bit. True for MIC failure report. - BOOLEAN bRequest, // EAPOL-Key Information field: Requst bit. - - u8Byte u8bKeyReplayCounter, // EAPOL-KEY Replay Counter field. - pu1Byte pKeyNonce, // EAPOL-Key Key Nonce field (32-byte). - u8Byte u8bKeyRSC, // EAPOL-Key Key RSC field (8-byte). - - POCTET_STRING posRSNIE, // Key Data field: Pointer to RSN IE. - pu1Byte pGTK, // Key Data field: Pointer to GTK. - BOOLEAN bEncrypt // encrypt the packet or not. added by Annie, 2005-07-11. -) -{ - PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); - PRT_SECURITY_T pSecInfo = &(pMgntInfo->SecurityInfo); - pu1Byte pHeader = Buffer; - static u1Byte Snap802_1H[6] = { 0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00 }; - - PEAPOL_STRUCT pEapol = NULL; - PEAPOL_KEY_STRUCT pEapolKey = NULL; - OCTET_STRING osEapolKey; - KeyDescVer eKeyDescVer; - u2Byte u2bEapolKeyMsgSz = 0; - u2Byte u2bEapolKeyDataLen = 0; - u1Byte tmpBuf[256]; - OCTET_STRING osKeyNonce; - OCTET_STRING osEapolKeyIV; - OCTET_STRING osKeyRSC; - OCTET_STRING osKeyID; - - // Figure Key Data Length and size of EAPOL-Key Msg. - if(posRSNIE != NULL) - { - u2bEapolKeyDataLen += (2+posRSNIE->Length); - } - if(pGTK != NULL) - { - //AP-WPA AES test,CCW - if( pSecInfo->SecLvl==RT_SEC_LVL_WPA ) - { - if(pSecInfo->PairwiseEncAlgorithm == RT_ENC_ALG_AESCCMP) - u2bEapolKeyDataLen += GTK_LEN_CCMP+8; - else - u2bEapolKeyDataLen += GTK_LEN; - } - else if( pSecInfo->SecLvl==RT_SEC_LVL_WPA2 ) - { - if(pSecInfo->PairwiseEncAlgorithm == RT_ENC_ALG_AESCCMP) - u2bEapolKeyDataLen += 24+8+2; // 24 is KED lengh ,8 is AES-WRAP add ,2 is for RSNIE to 8's muitiple ; - else - u2bEapolKeyDataLen += 40+8+2; // 40 is KED lengh,8 is AES-WRAP add ,2 is for RSNIE to 8's muitiple - } - } - u2bEapolKeyMsgSz = EAPOLMSG_HDRLEN + u2bEapolKeyDataLen; - - //------------------------------------------------------------------------- - // MAC Header. - //------------------------------------------------------------------------- - SET_80211_HDR_FRAME_CONTROL(pHeader, 0); - SET_80211_HDR_TYPE_AND_SUBTYPE(pHeader, Type_Data); - - switch(pMgntInfo->OpMode) - { - case RT_OP_MODE_INFRASTRUCTURE: // 1,0 - SET_80211_HDR_TO_DS(pHeader, 1); - SET_80211_HDR_ADDRESS1(pHeader, pMgntInfo->Bssid); // BSSID - SET_80211_HDR_ADDRESS2(pHeader, Adapter->CurrentAddress); // SA - SET_80211_HDR_ADDRESS3(pHeader, StaAddr); // DA - break; - case RT_OP_MODE_AP: // 0,1 - SET_80211_HDR_FROM_DS(pHeader, 1); - SET_80211_HDR_ADDRESS1(pHeader, StaAddr); // DA - SET_80211_HDR_ADDRESS2(pHeader, pMgntInfo->Bssid); // BSSID - SET_80211_HDR_ADDRESS3(pHeader, Adapter->CurrentAddress); // SA - break; - case RT_OP_MODE_IBSS: // 0,0 - default: - // Handle it as IBSS, 2004.08.21, by rcnjko. - SET_80211_HDR_ADDRESS1(pHeader, StaAddr); // DA - SET_80211_HDR_ADDRESS2(pHeader, Adapter->CurrentAddress); // SA - SET_80211_HDR_ADDRESS3(pHeader, pMgntInfo->Bssid); // BSSID - break; - } - - SET_80211_HDR_DURATION(pHeader, 0); - SET_80211_HDR_FRAGMENT_SEQUENCE(pHeader, 0); - *pLength = sMacHdrLng; - - //------------------------------------------------------------------------- - // Security Header: leave space for it if necessary. - //------------------------------------------------------------------------- -// if(eKeyType == type_Group) - if( bEncrypt ) - { // EAPOL-Key of Group key handshake will be encrypted via PTK, 2005.07.01, by rcnjko. - PlatformFillMemory( &(Buffer[*pLength]), pSecInfo->EncryptionHeadOverhead, 0x00); - *pLength += pSecInfo->EncryptionHeadOverhead; - } - - //------------------------------------------------------------------------- - // Frame Body. - //------------------------------------------------------------------------- - // - // 1. LLC+TypeLen - // - PlatformMoveMemory( &(Buffer[*pLength]), Snap802_1H, LLC_HEADER_SIZE); - *pLength += LLC_HEADER_SIZE; - Buffer[*pLength] = 0x88; - Buffer[*pLength+1] = 0x8e; - *pLength += 2; - - // - // 2. EAPOL Header - // - pEapol = (PEAPOL_STRUCT)( &(Buffer[*pLength]) ); - pEapol->protocol_version = LIB1X_EAPOL_VER; - pEapol->packet_type = LIB1X_EAPOL_KEY; - short2net(u2bEapolKeyMsgSz, ((pu1Byte)&(pEapol->packet_body_length)) ); - *pLength += LIB1X_EAPOL_HDRLEN; - - // - // 3. EAPOL-Key descriptor. - // - pEapolKey = (PEAPOL_KEY_STRUCT)( &(Buffer[*pLength]) ); - FillOctetString(osEapolKey, pEapolKey, EAPOLMSG_HDRLEN); - - // 3.1 Descryptor Type. - Message_setDescType(osEapolKey, ((pSecInfo->SecLvl==RT_SEC_LVL_WPA) ? desc_type_RSN : desc_type_WPA2)); - - // 3.2 Key Information. - PlatformFillMemory(pEapolKey->key_info, 2, 0x00); - //AP-WPA AES test,CCW - eKeyDescVer = ((pSecInfo->PairwiseEncAlgorithm==RT_ENC_ALG_TKIP ) ? key_desc_ver1 : key_desc_ver2); - Message_setKeyDescVer(osEapolKey, eKeyDescVer); - Message_setKeyType(osEapolKey, ((eKeyType == type_Group) ? 0 : 1) ); - Message_setKeyIndex(osEapolKey, ((eKeyType == type_Group) ? 1 : 0) ); - Message_setInstall(osEapolKey, bInstall); - Message_setKeyAck(osEapolKey, bKeyAck); - Message_setKeyMIC(osEapolKey, bKeyMIC); - Message_setSecure(osEapolKey, bSecure); - Message_setError(osEapolKey, bError); - Message_setRequest(osEapolKey, bRequest); - Message_setEncryptedKeyData(osEapolKey, ((pSecInfo->SecLvl == RT_SEC_LVL_WPA2 && pGTK != NULL) ? TRUE : FALSE)); // It falls to a reserved bit. Marked by Annie, 2005-07-10. - - // 3.3 Key Length. - //AP-WPA AES test,CCW - Message_setKeyLength(osEapolKey, ((pSecInfo->PairwiseEncAlgorithm==RT_ENC_ALG_TKIP) ? 32 : 16)); - - // 3.4 Key Replay Counter. - PlatformMoveMemory( osEapolKey.Octet + ReplayCounterPos, &u8bKeyReplayCounter, 8); - - // 3.5 Key Nonce. - FillOctetString(osKeyNonce, pKeyNonce, KEY_NONCE_LEN); - Message_setKeyNonce(osEapolKey, osKeyNonce); - - // 3.6 EAPOL-Key IV. - PlatformFillMemory(tmpBuf, KEY_IV_LEN, 0); - FillOctetString(osEapolKeyIV, tmpBuf, KEY_IV_LEN); - Message_setKeyIV(osEapolKey, osEapolKeyIV); - - // 3.7 Key RSC. - FillOctetString(osKeyRSC, &(u8bKeyRSC), sizeof(u8bKeyRSC)); - Message_setKeyRSC(osEapolKey, osKeyRSC); - - // 3.8 Key ID? - PlatformFillMemory(tmpBuf, KEY_ID_LEN, 0); - FillOctetString(osKeyID, tmpBuf, KEY_ID_LEN); - Message_setKeyID(osEapolKey, osKeyID); - - // 3.9 Key MIC. We will fill it up later if required. - Message_clearMIC(osEapolKey); - - // 3.10 Key Data Length. - Message_setKeyDataLength(osEapolKey, u2bEapolKeyDataLen); - - // 3.11 Key Data. - // IE. - if(posRSNIE != NULL && posRSNIE->Length > 0) - { - PacketMakeElement( &osEapolKey, - (pSecInfo->SecLvl == RT_SEC_LVL_WPA) ? EID_Vendor : EID_WPA2, (*posRSNIE) ); - } - // KDE. - if(pGTK != NULL && pSecInfo->SecLvl == RT_SEC_LVL_WPA) - { - RT_ASSERT((pKEK!=NULL), ("ConstructEapolKeyPacket(): pGTK!=NULL pKCK=%p!!!", pKEK)); - //AP-WPA AES test,CCW - //PlatformMoveMemory( &(osEapolKey.Octet[osEapolKey.Length]), pGTK, GTK_LEN); - //osEapolKey.Length += GTK_LEN; - if( pSecInfo->PairwiseEncAlgorithm == RT_ENC_ALG_AESCCMP ) - { - PlatformMoveMemory( &(osEapolKey.Octet[osEapolKey.Length]), pGTK, GTK_LEN_CCMP); - osEapolKey.Length += GTK_LEN_CCMP + 8; //When after AES-WRAP keydata length add 8; - } - else - { - PlatformMoveMemory( &(osEapolKey.Octet[osEapolKey.Length]), pGTK, GTK_LEN); - osEapolKey.Length += GTK_LEN; - } - if(pKEK) - { - // Encode Key Data field if necessary. - //RT_TRACE(COMP_WPAAES, DBG_LOUD, ("=========> Encrypt EAPOL ^^")); - EncEapolKeyData(Adapter, osEapolKey, pKEK, PTK_LEN_EAPOLENC); - } - } - else if( pGTK != NULL && pSecInfo->SecLvl == RT_SEC_LVL_WPA2 ) - { - PKDE_STRUCT pKDE = NULL; - u1Byte KEDOUI[] = {0x00,0x0F,0xAC}; //00-0F-AC - pKDE = (PKDE_STRUCT)( &(osEapolKey.Octet[osEapolKey.Length])); - // KeyID = bit0~bit2 - // TX = bit3 - // resved = bit4~bit7 and byte2 - // GTK data length = ( Length -6 ) - - pKDE->IEType= 0xdd; //IE ID = 0xDD - - if( pSecInfo->PairwiseEncAlgorithm == RT_ENC_ALG_AESCCMP ) - { - pKDE->IELen = 0x16; // 18+4 = 22 - osEapolKey.Length += 24+8+2; - } - else if( pSecInfo->PairwiseEncAlgorithm == RT_ENC_ALG_TKIP ) - { - pKDE->IELen = 0x26; // 34+4 = 38 - osEapolKey.Length += 40+8+2; - } - - PlatformMoveMemory(pKDE->OUI, KEDOUI, 3); - - pKDE->Datatype = 0x01; - - pKDE->KID = 0x01; //Set Group Key ID = 1; - - pKDE->Reserved = 0x00; // Set Reserved to all 0; - - PlatformZeroMemory(pKDE->GTK , 64 ); - - if( pSecInfo->PairwiseEncAlgorithm == RT_ENC_ALG_AESCCMP ) - PlatformMoveMemory(pKDE->GTK , pGTK , 16); - else if( pSecInfo->PairwiseEncAlgorithm == RT_ENC_ALG_TKIP ) - PlatformMoveMemory(pKDE->GTK , pGTK , 32); - - if(pKEK) - { - // Encode Key Data field if necessary. - EncEapolKeyData(Adapter, osEapolKey, pKEK, PTK_LEN_EAPOLENC); - } - } - *pLength += u2bEapolKeyMsgSz; - - // Figure out EAPOL-Key MIC if required. - if(bKeyMIC) - { - OCTET_STRING osEapolMsgToSend; - - RT_ASSERT((pKCK!=NULL), ("ConstructEapolKeyPacket(): bKeyMIC pKCK=%p!!!", pKCK)); - if(pKCK != NULL) - { - FillOctetString(osEapolMsgToSend, pEapol, (LIB1X_EAPOL_HDRLEN+u2bEapolKeyMsgSz) ); - CalcEapolMIC(osEapolMsgToSend, eKeyDescVer, pKCK, KEY_MIC_LEN); - } - } -} - - -// -// Description: Construct EAPOL-Star Packet Let AP try to re-key !! -// -VOID -ConstructEAPOLStartPacket( - IN PADAPTER Adapter, - IN pu1Byte Buffer, - IN pu4Byte pLength, - IN BOOLEAN bEncrypt - ) -{ - PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); - PRT_SECURITY_T pSecInfo = &(pMgntInfo->SecurityInfo); - pu1Byte pHeader = Buffer; - static u1Byte Snap802_1H[6] = { 0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00 }; - PEAPOL_STRUCT pEapol = NULL; - u2Byte u2bEapol = 0; - - - //------------------------------------------------------------------------- - // MAC Header. - //------------------------------------------------------------------------- - SET_80211_HDR_FRAME_CONTROL(pHeader, 0); - SET_80211_HDR_TYPE_AND_SUBTYPE(pHeader, Type_Data); - - switch(pMgntInfo->OpMode) - { - case RT_OP_MODE_INFRASTRUCTURE: // 1,0 - SET_80211_HDR_TO_DS(pHeader, 1); - SET_80211_HDR_ADDRESS1(pHeader, pMgntInfo->Bssid); // BSSID - SET_80211_HDR_ADDRESS2(pHeader, Adapter->CurrentAddress); // SA - SET_80211_HDR_ADDRESS3(pHeader, pMgntInfo->Bssid); // DA - break; - case RT_OP_MODE_AP: // 0,1 - SET_80211_HDR_FROM_DS(pHeader, 1); - SET_80211_HDR_ADDRESS1(pHeader, pMgntInfo->Bssid); // DA - SET_80211_HDR_ADDRESS2(pHeader, pMgntInfo->Bssid); // BSSID - SET_80211_HDR_ADDRESS3(pHeader, Adapter->CurrentAddress); // SA - break; - case RT_OP_MODE_IBSS: // 0,0 - default: - // Handle it as IBSS, 2004.08.21, by rcnjko. - SET_80211_HDR_ADDRESS1(pHeader, pMgntInfo->Bssid); // DA - SET_80211_HDR_ADDRESS2(pHeader, Adapter->CurrentAddress); // SA - SET_80211_HDR_ADDRESS3(pHeader, pMgntInfo->Bssid); // BSSID - break; - } - - SET_80211_HDR_DURATION(pHeader, 0); - SET_80211_HDR_FRAGMENT_SEQUENCE(pHeader, 0); - *pLength = sMacHdrLng; - - //------------------------------------------------------------------------- - // Security Header: leave space for it if necessary. - //------------------------------------------------------------------------- - if( bEncrypt ) - { // EAPOL-Key of Group key handshake will be encrypted via PTK, 2005.07.01, by rcnjko. - PlatformFillMemory( &(Buffer[*pLength]), pSecInfo->EncryptionHeadOverhead, 0x00); - *pLength += pSecInfo->EncryptionHeadOverhead; - } - - - //------------------------------------------------------------------------- - // Frame Body. - //------------------------------------------------------------------------- - // - // 1. LLC+TypeLen - // - PlatformMoveMemory( &(Buffer[*pLength]), Snap802_1H, LLC_HEADER_SIZE); - *pLength += LLC_HEADER_SIZE; - Buffer[*pLength] = 0x88; - Buffer[*pLength+1] = 0x8e; - *pLength += 2; - - // - // 2. EAPOL Header - // - pEapol = (PEAPOL_STRUCT)( &(Buffer[*pLength]) ); - pEapol->protocol_version = LIB1X_EAPOL_VER; - pEapol->packet_type = LIB1X_EAPOL_START; - short2net(u2bEapol, ((pu1Byte)&(pEapol->packet_body_length)) ); - *pLength += LIB1X_EAPOL_HDRLEN; - -} - - -// -// Description: Construct CCX Radio Measure Report packet. -// 2006.05.07, by rcnjko. -// -VOID -ConstructCcxRmReport( - IN PADAPTER Adapter, - IN pu1Byte Buffer, - IN pu4Byte pLength, - IN PRT_RM_REPORTS pRmReports - ) -{ - PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); - PSTA_QOS pStaQos = pMgntInfo->pStaQos; - PRT_SECURITY_T pSecInfo = &(pMgntInfo->SecurityInfo); - pu1Byte pHeader = Buffer; - PRM_REPORT_PACKET pRmRptPkt = NULL; - POCTET_STRING posRpts = &(pRmReports->osMeasRptEles); - static u1Byte CiscoAironetSnap[CISCO_AIRONET_SNAP_LENGTH] = { 0xAA, 0xAA, 0x03, 0x00, 0x40, 0x96, 0x00, 0x00}; - u2Byte IappIdLen; - - RT_TRACE(COMP_SEND, DBG_LOUD, ("+ ConstructCcxRmReport()\n")); - - //------------------------------------------------------------------------- - // MAC Header. - //------------------------------------------------------------------------- - RT_ASSERT(pMgntInfo->OpMode==RT_OP_MODE_INFRASTRUCTURE, - ("ConstructCcxRmReport(): OpMode(%d) != RT_OP_MODE_INFRASTRUCTURE(%d)\n", pMgntInfo->OpMode, RT_OP_MODE_INFRASTRUCTURE)); - - SET_80211_HDR_FRAME_CONTROL(pHeader, 0); - SET_80211_HDR_TYPE_AND_SUBTYPE(pHeader, Type_Data); - SET_80211_HDR_TO_DS(pHeader, 1); - SET_80211_HDR_ADDRESS1(pHeader, pMgntInfo->Bssid); - SET_80211_HDR_ADDRESS2(pHeader, Adapter->CurrentAddress); - SET_80211_HDR_ADDRESS3(pHeader, pMgntInfo->Bssid); - - SET_80211_HDR_DURATION(pHeader, 0); - SET_80211_HDR_FRAGMENT_SEQUENCE(pHeader, 0); - *pLength = sMacHdrLng; - - //------------------------------------------------------------------------- - // Qos Header: leave space for it if necessary. - //------------------------------------------------------------------------- - if(pStaQos->CurrentQosMode > QOS_DISABLE) - { - SET_80211_HDR_QOS_EN(pHeader, 1); - PlatformZeroMemory(&(Buffer[*pLength]), sQoSCtlLng); - *pLength += sQoSCtlLng; - } - - //------------------------------------------------------------------------- - // Security Header: leave space for it if necessary. - //------------------------------------------------------------------------- - if(pSecInfo->EncryptionHeadOverhead > 0) - { - PlatformZeroMemory(&(Buffer[*pLength]), pSecInfo->EncryptionHeadOverhead); - *pLength += pSecInfo->EncryptionHeadOverhead; - } - - //------------------------------------------------------------------------- - // Frame Body. - //------------------------------------------------------------------------- - pRmRptPkt = (PRM_REPORT_PACKET)(Buffer + *pLength); - - // - // 1. Cisco Aironet SNAP Header. - // - PlatformMoveMemory( pRmRptPkt->SnapHeader, CiscoAironetSnap, CISCO_AIRONET_SNAP_LENGTH); - *pLength += CISCO_AIRONET_SNAP_LENGTH; - - // - // 2. IAPP ID & Length - // - IappIdLen = (CISCO_RM_RPT_IAPP_LENGTH - CISCO_AIRONET_SNAP_LENGTH - 1) + posRpts->Length; - - RT_TRACE(COMP_SEND, DBG_LOUD, ("IAPP ID & Length: 0x%04X\n", IappIdLen)); - RT_ASSERT((IappIdLen < 0x1000), ("ConstructCcxRmReport(): IappIdLen(%#X) should < 0x1000 !!!\n", IappIdLen)); - SET_RMRPT_IAPPIDLEN(pRmRptPkt, IappIdLen); - - // - // 3. IAPP Type - // - SET_RMRPT_IAPPTYPE(pRmRptPkt, CCX_RM_IAPP_TYPE); - - // - // 4. IAPP SubType - // - SET_RMRPT_IAPPSUBTYPE(pRmRptPkt, CCX_RM_REPORT_IAPP_SUBTYPE); - - // - // 5. Destination MAC Address. - // - PlatformZeroMemory(pRmRptPkt->DstAddr, 6); - - // - // 6. Source MAC Address. - // - PlatformMoveMemory(pRmRptPkt->SrcAddr, Adapter->CurrentAddress, 6); - - // - // 7. Dialog Token. - // - if(pRmReports->bAutonomous == FALSE) - SET_RMRPT_DIALOGTOKEN(pRmRptPkt, pRmReports->DialogToken); - else - SET_RMRPT_DIALOGTOKEN(pRmRptPkt, 0); - - // - // 8. Measurement Report Elements. - // - PlatformMoveMemory(pRmRptPkt->Elements, posRpts->Octet, posRpts->Length); - *pLength += IappIdLen; - - RT_PRINT_DATA((COMP_RM|COMP_SEND), DBG_LOUD, ("CCX RM Report:\n"), Buffer, *pLength); - - RT_TRACE(COMP_SEND, DBG_TRACE, ("- ConstructCcxRmReport()\n")); -} - -// -// Description: -// Construct the packet of dot11k radio measurment report. -// By Bruce, 2009-07-23. -// -VOID -ConstructDot11kRmReport( - IN PADAPTER Adapter, - IN pu1Byte Buffer, - IN pu4Byte pLength, - IN PRT_RM_REQUESTS pRmRequests, - IN PRT_RM_REPORTS pRmReports - ) -{ - PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); - pu1Byte pHeader = Buffer; - POCTET_STRING posRpts = &(pRmReports->osMeasRptEles); - - RT_TRACE(COMP_SEND, DBG_LOUD, ("+ ConstructDot11kRmReport()\n")); - - SET_80211_HDR_FRAME_CONTROL(pHeader, 0); - SET_80211_HDR_TYPE_AND_SUBTYPE(pHeader, Type_Action); - - SET_80211_HDR_ADDRESS1(pHeader, pRmRequests->SrcAddr); - SET_80211_HDR_ADDRESS2(pHeader, Adapter->CurrentAddress); - SET_80211_HDR_ADDRESS3(pHeader, pMgntInfo->Bssid); - - SET_80211_HDR_DURATION(pHeader, 0); - SET_80211_HDR_FRAGMENT_SEQUENCE(pHeader, 0); - *pLength = sMacHdrLng; - - SET_ACTFRAME_CATEGORY_CODE(pHeader, ACT_CAT_RM); - SET_ACTFRAME_ACTION_CODE(pHeader, ACT_RM_REPORT); - SET_ACTFRAME_DIALOG_TOKEN(pHeader, pRmRequests->DialogToken); - *pLength += 3; - - // - // Measurement Report Elements. - // - PlatformMoveMemory((pHeader + *pLength), posRpts->Octet, posRpts->Length); - - *pLength += posRpts->Length; - - RT_PRINT_DATA((COMP_RM|COMP_SEND), DBG_LOUD, ("ConstructDot11kRmReport:\n"), Buffer, *pLength); - - RT_TRACE(COMP_SEND, DBG_TRACE, ("- ConstructDot11kRmReport()\n")); -} - -//Add for ROGUE AP 2007.07.28 , by CCW -//Description: Construct CCX ROGUE AP Report packet. -VOID -ConstructCcxROGUEAPReport( - PADAPTER Adapter, - pu1Byte Buffer, - pu4Byte pLength, - int index -) -{ - PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); - PSTA_QOS pStaQos = pMgntInfo->pStaQos; - PRT_SECURITY_T pSecInfo = &(pMgntInfo->SecurityInfo); - pu1Byte pHeader = Buffer; - static u1Byte CiscoAironetSnap[CISCO_AIRONET_SNAP_LENGTH] = { 0xAA, 0xAA, 0x03, 0x00, 0x40, 0x96, 0x00, 0x00}; - PROGUEAP_REPORT_PACKET pROGUEAPRptPkt = NULL; - static u1Byte ROGUEAPRptLen[2] = {0x00, 0x28}; - static u1Byte AuthTimeoutFailure[2] = {0x00,0x02}; - static u1Byte ChallengeFromApFailure[2] = {0x00,0x03}; - static u1Byte ChallengeToApFailure[2] = {0x00,0x04}; - static u1Byte Invalidauthenticationtype[2] = {0x00,0x01}; - ULONG ln; - //RT_TRACE(COMP_SEND), DBG_TRACE, ("+ ConstructCcxRmReport()\n")); - //------------------------------------------------------------------------- - // MAC Header. - //------------------------------------------------------------------------- - - SET_80211_HDR_FRAME_CONTROL(pHeader, 0); - SET_80211_HDR_TYPE_AND_SUBTYPE(pHeader, Type_Data); - SET_80211_HDR_TO_DS(pHeader, 1); - SET_80211_HDR_ADDRESS1(pHeader, pMgntInfo->Bssid); // BSSID - SET_80211_HDR_ADDRESS2(pHeader, Adapter->CurrentAddress); //SA - SET_80211_HDR_ADDRESS3(pHeader, pMgntInfo->Bssid); //DA - - SET_80211_HDR_DURATION(pHeader, 0); - SET_80211_HDR_FRAGMENT_SEQUENCE(pHeader, 0); - *pLength = sMacHdrLng; - - //------------------------------------------------------------------------- - // Qos Header: leave space for it if necessary. - //------------------------------------------------------------------------- - if(pStaQos->CurrentQosMode > QOS_DISABLE) - { - SET_80211_HDR_QOS_EN(pHeader, 1); - PlatformZeroMemory(&(Buffer[*pLength]), sQoSCtlLng); - *pLength += sQoSCtlLng; - } - - //------------------------------------------------------------------------- - // Security Header: leave space for it if necessary. - //------------------------------------------------------------------------- - if(pSecInfo->SecLvl > RT_SEC_LVL_NONE) - { - PlatformZeroMemory(&(Buffer[*pLength]), pSecInfo->EncryptionHeadOverhead); - *pLength += pSecInfo->EncryptionHeadOverhead; - } - - //------------------------------------------------------------------------- - // Frame Body. - //------------------------------------------------------------------------- - pROGUEAPRptPkt = (PROGUEAP_REPORT_PACKET)(Buffer + *pLength); - - // - // 1. Cisco Aironet SNAP Header. - // - PlatformMoveMemory( pROGUEAPRptPkt->SnapHeader, CiscoAironetSnap, CISCO_AIRONET_SNAP_LENGTH); - - *pLength += CISCO_AIRONET_SNAP_LENGTH; - - - // - // 2.Set length :length in bytes of all the following fields including this field (40 bytes) - // - - PlatformMoveMemory(&(pROGUEAPRptPkt->ROGUEAPLen) , ROGUEAPRptLen , 2 ); - - // - // 3.message type : 0x40 - // - - pROGUEAPRptPkt->message_type = H2N1BYTE(ROGUEAP_message_type); - - // - // 4.function code : 0x8e - // - - pROGUEAPRptPkt->function_code = H2N1BYTE(ROGUEAP_function_code); - - // - // 5.Destination MAC Address. - // - PlatformMoveMemory(pROGUEAPRptPkt->DstAddr, pMgntInfo->Bssid, 6); - - // - // 6.Source MAC Address. - // - PlatformMoveMemory(pROGUEAPRptPkt->SrcAddr, Adapter->CurrentAddress, 6); - - // - // 7.Failure Reason - // - switch(pMgntInfo->ROGUE_AP_ENTEY[index].code) - { - case MH_CCX_ROGUE_AP_STATUS_AuthTimeoutFailure: - //pROGUEAPRptPkt->Failure_Reason = H2N2BYTE(AuthTimeoutFailure); - PlatformMoveMemory(&(pROGUEAPRptPkt->Failure_Reason) , AuthTimeoutFailure , 2 ); - break; - case MH_CCX_ROGUE_AP_STATUS_ChallengeFromApFailure: - //pROGUEAPRptPkt->Failure_Reason = H2N2BYTE(ChallengeFromApFailure); - PlatformMoveMemory(&(pROGUEAPRptPkt->Failure_Reason) , ChallengeFromApFailure , 2 ); - break; - case MH_CCX_ROGUE_AP_STATUS_ChallengeToApFailure: - //pROGUEAPRptPkt->Failure_Reason = H2N2BYTE(ChallengeToApFailure); - PlatformMoveMemory(&(pROGUEAPRptPkt->Failure_Reason) , ChallengeToApFailure , 2 ); - break; - case MH_CCX_ROGUE_AP_STATUS_Invalidauthenticationtype : - //pROGUEAPRptPkt->Failure_Reason = H2N2BYTE(Invalidauthenticationtype); - PlatformMoveMemory(&(pROGUEAPRptPkt->Failure_Reason) , Invalidauthenticationtype , 2 ); - break; - } - - - // - // 8. Rogue AP Mac address - // - PlatformMoveMemory(pROGUEAPRptPkt->RogueAPAddr, pMgntInfo->ROGUE_AP_ENTEY[index].bssid , 6); - - // - // 9.Rogue AP name - // - PlatformZeroMemory(pROGUEAPRptPkt->RogueAPname, 16); - - *pLength += 40; - - ln = *pLength; - - - //RT_PRINT_DATA((COMP_RM|COMP_SEND), DBG_LOUD, ("ROGUE AP Report: "), Buffer, *pLength); - -} - - -VOID -ConstructMaFrameHdr( - IN PADAPTER Adapter, - IN pu1Byte pAddr, - IN u1Byte Category, - IN u1Byte Action, - OUT POCTET_STRING posMaFrame - ) -{ - pu1Byte pMaPartial = posMaFrame->Octet; - u1Byte MaHdr[5]; - OCTET_STRING osTemp; - - SET_80211_HDR_FRAME_CONTROL(pMaPartial,0); - SET_80211_HDR_TYPE_AND_SUBTYPE(pMaPartial,Type_Action); - SET_80211_HDR_DURATION(pMaPartial,0); - SET_80211_HDR_FRAGMENT_SEQUENCE(pMaPartial,0); - SET_80211_HDR_ADDRESS1(pMaPartial, pAddr); - SET_80211_HDR_ADDRESS2(pMaPartial, Adapter->CurrentAddress); - SET_80211_HDR_ADDRESS3(pMaPartial, Adapter->MgntInfo.Bssid); - posMaFrame->Length = sMacHdrLng; - - MaHdr[0] = Category; - MaHdr[1] = Action; - - FillOctetString(osTemp, MaHdr, 2); - PacketAppendData(posMaFrame, osTemp); - -} - -// -// Description: -// Append the additional IEs to the Beacon frame, by Bruce, 2007-08-13. -// Note: -// No need to specify the Element IDs, because the input buffer has included the ID and length. -// -VOID -AppendAdditionalIEs( - OUT POCTET_STRING packet, - IN OCTET_STRING ies - ) -{ - RT_TRACE(COMP_MLME, DBG_TRACE, ("AppendAdditionalIEs(): Length = %d\n", ies.Length)); - PacketAppendData(packet, ies); -} - -// -// Description: -// Construct Qos ADDTS packet by the input ts. -// -VOID -ConstructQosADDTSPacket( - IN PADAPTER Adapter, - IN pu1Byte Buffer, - IN pu4Byte pLength, - IN u1Byte DialogToken, - IN PQOS_TSTREAM pTs, - IN u4Byte numTspec - ) -{ - PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); -// PRT_SECURITY_T pSecInfo = &(pMgntInfo->SecurityInfo); - PSTA_QOS pStaQos = pMgntInfo->pStaQos; - OCTET_STRING osAddTs; - OCTET_STRING osTempField; - u4Byte i; - PQOS_TSTREAM pStream = pTs; - u1Byte WMM_Filed[4] = {0}; - - RT_ASSERT(pTs!=NULL, ("ConstructQosADDTSPacket(): pTs should not be NULL\n")); - - FillOctetString(osAddTs, Buffer, 0); - //------------------------------------------------------------------------- - // MAC Header. - //------------------------------------------------------------------------- - - SET_80211_HDR_FRAME_CONTROL(osAddTs.Octet, 0); - SET_80211_HDR_TYPE_AND_SUBTYPE(osAddTs.Octet, Type_Action); - SET_80211_HDR_ADDRESS1(osAddTs.Octet, pMgntInfo->Bssid); - SET_80211_HDR_ADDRESS2(osAddTs.Octet, Adapter->CurrentAddress); - SET_80211_HDR_ADDRESS3(osAddTs.Octet, pMgntInfo->Bssid); - - SET_80211_HDR_DURATION(osAddTs.Octet, 0); - SET_80211_HDR_FRAGMENT_SEQUENCE(osAddTs.Octet, 0); - osAddTs.Length += sMacHdrLng; - - //------------------------------------------------------------------------- - // Security Header: leave space for it if necessary. - //------------------------------------------------------------------------- - CCX_ConstructQosADDTSPacket(Adapter, &osAddTs); - - //------------------------------------------------------------------------- - //WMM Action Frame Fixed Field - //------------------------------------------------------------------------- - WMM_Filed[0] = WMM_ACTION_CATEGORY_CODE; // Category Code - WMM_Filed[1] = (u1Byte)ADDTS_REQ; // Action Code - WMM_Filed[2] = DialogToken; // Dialog Token - WMM_Filed[3] = 0; // Status Code - - FillOctetString(osTempField, WMM_Filed, sizeof(WMM_Filed)); - PacketAppendData(&osAddTs, osTempField); - - //------------------------------------------------------------------------- - // TSPEC IE & TSRS - //------------------------------------------------------------------------- - for (i = 0; i < numTspec; i ++) - { - // TSPEC - FillOctetString(osTempField, pStream->OutStandingTSpec, sizeof(WMM_TSPEC)); - PacketAppendData(&osAddTs, osTempField); - - // TSRS - // CCXv4 S54, A STA shall use the TSRS IE in the ADDTS request or (Re-)association Request. This value of Nominal PHY rate must be - // greater than or equal to the Minimum PHY rate expressed in the TSPEC IE. By Bruce, 2009-06-23. - if (QOS_RATE_TO_BPS( QosGetNPR(Adapter, pStream) ) >= - GET_TSPEC_MIN_PHY_RATE(pStream->OutStandingTSpec) ) - { - QosConstructTSRS(Adapter, pStream, &osAddTs); - } - - pStream->DialogToken = pStaQos->DialogToken; - pStream ++; - } - - //------------------------------------------------------------------------- - // MHDR IE for MFP - //------------------------------------------------------------------------- - CCX_AppendMHDRIE(Adapter, &osAddTs); - - *pLength = osAddTs.Length; -} - -// -// Description: -// Construct Qos DELTS packet by the input TS. -// -VOID -ConstructQosDELTSPacket( - IN PADAPTER Adapter, - IN pu1Byte Buffer, - IN pu4Byte pLength, - IN PQOS_TSTREAM pTs, - IN u4Byte numTspec - ) -{ - PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); -// PRT_SECURITY_T pSecInfo = &(pMgntInfo->SecurityInfo); - OCTET_STRING osDelTs; - OCTET_STRING osTempField; - u4Byte i; - PQOS_TSTREAM pStream = pTs; - u1Byte WMM_Filed[4] = {0}; - - RT_ASSERT(pTs!=NULL, ("ConstructQosDELTSPacket(): pTs should not be NULL\n")); - - FillOctetString(osDelTs, Buffer, 0); - - //------------------------------------------------------------------------- - // MAC Header. - //------------------------------------------------------------------------- - SET_80211_HDR_FRAME_CONTROL(osDelTs.Octet, 0); - SET_80211_HDR_TYPE_AND_SUBTYPE(osDelTs.Octet, Type_Action); - SET_80211_HDR_ADDRESS1(osDelTs.Octet, pMgntInfo->Bssid); - SET_80211_HDR_ADDRESS2(osDelTs.Octet, Adapter->CurrentAddress); - SET_80211_HDR_ADDRESS3(osDelTs.Octet, pMgntInfo->Bssid); - - SET_80211_HDR_DURATION(osDelTs.Octet, 0); - SET_80211_HDR_FRAGMENT_SEQUENCE(osDelTs.Octet, 0); - osDelTs.Length += sMacHdrLng; - - //------------------------------------------------------------------------- - // Security Header: leave space for it if necessary. - //------------------------------------------------------------------------- - CCX_ConstructQosDELTSPacket(Adapter, &osDelTs); - - //------------------------------------------------------------------------- - // WMM Action Frame Fixed Field - //------------------------------------------------------------------------- - WMM_Filed[0] = WMM_ACTION_CATEGORY_CODE; // Category Code - WMM_Filed[1] = (u1Byte)DELTS; // Action Code - WMM_Filed[2] = 0; // Dialog Token - WMM_Filed[3] = 0; // Status Code - - FillOctetString(osTempField, WMM_Filed, sizeof(WMM_Filed)); - PacketAppendData(&osDelTs, osTempField); - - //------------------------------------------------------------------------- - // TSPEC IE - //------------------------------------------------------------------------- - for (i = 0; i < numTspec; i ++) - { - FillOctetString(osTempField, pStream->TSpec, sizeof(WMM_TSPEC)); - PacketAppendData(&osDelTs, osTempField); - pStream ++; - } - - //------------------------------------------------------------------------- - // MHDR IE for MFP - //------------------------------------------------------------------------- - CCX_AppendMHDRIE(Adapter, &osDelTs ); - - *pLength = osDelTs.Length; -} - -// -// Description: -// Construct the CCX packet of Neighbor List Polling to the Cisco AP. -// By Bruce, 2008-03-22. -// -VOID -ConstructCcxNeighborPoll( - IN PADAPTER Adapter, - OUT pu1Byte Buffer, - OUT pu4Byte pLength - ) -{ - PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); - PSTA_QOS pStaQos = pMgntInfo->pStaQos; - PRT_SECURITY_T pSecInfo = &(pMgntInfo->SecurityInfo); - pu1Byte pHeader = Buffer; - static u1Byte CiscoAironetSnap[CISCO_AIRONET_SNAP_LENGTH] = { 0xAA, 0xAA, 0x03, 0x00, 0x40, 0x96, 0x00, 0x00}; - u2Byte IappIdLen, tmp2Byte; - pu1Byte pIappPkt; - - // - // Figure out IAPP pakcet length. - // - IappIdLen = 0x10; - - //------------------------------------------------------------------------- - // MAC Header. - //------------------------------------------------------------------------- - SET_80211_HDR_FRAME_CONTROL(pHeader, 0); - SET_80211_HDR_TYPE_AND_SUBTYPE(pHeader, Type_Data); - SET_80211_HDR_TO_DS(pHeader, 1); - SET_80211_HDR_ADDRESS1(pHeader, pMgntInfo->Bssid); - SET_80211_HDR_ADDRESS2(pHeader, Adapter->CurrentAddress); - SET_80211_HDR_ADDRESS3(pHeader, pMgntInfo->Bssid); - - SET_80211_HDR_DURATION(pHeader, 0); - SET_80211_HDR_FRAGMENT_SEQUENCE(pHeader, 0); - *pLength = sMacHdrLng; - - //------------------------------------------------------------------------- - // Qos Header: leave space for it if necessary. - //------------------------------------------------------------------------- - if(pStaQos->CurrentQosMode > QOS_DISABLE) - { - SET_80211_HDR_QOS_EN(pHeader, 1); - PlatformZeroMemory(&(Buffer[*pLength]), sQoSCtlLng); - *pLength += sQoSCtlLng; - } - - //------------------------------------------------------------------------- - // Security Header: leave space for it if necessary. - //------------------------------------------------------------------------- - if(pSecInfo->EncryptionHeadOverhead > 0) - { - PlatformZeroMemory(&(Buffer[*pLength]), pSecInfo->EncryptionHeadOverhead); - *pLength += pSecInfo->EncryptionHeadOverhead; - } - - //------------------------------------------------------------------------- - // Frame Body. - //------------------------------------------------------------------------- - pIappPkt = (Buffer + *pLength); - - // - // 1. Cisco Aironet SNAP Header. - // - SET_AARPT_IAPP_SNAP_HEADER(pIappPkt, CiscoAironetSnap, CISCO_AIRONET_SNAP_LENGTH); - *pLength += CISCO_AIRONET_SNAP_LENGTH; - - - // - // 2. IAPP length field: length of packet including this field. - // - tmp2Byte = H2N2BYTE(IappIdLen); - SET_AARPT_IAPPIDLEN(pIappPkt, &tmp2Byte); - *pLength += 2; - - // - // 3. IAPP type: 0x33 - // - SET_AARPT_IAPPTYPE(pIappPkt, CCX_L2ROAM_IAPP_TYPE); - *pLength += 1; - - // - // 4. Function code: 0x01 - // - SET_AARPT_IAPPFUNCTION(pIappPkt, 0x01); - *pLength += 1; - - // - // 5. Destination MAC Address. - // - SET_AARPT_IAPPDEST(pIappPkt, pMgntInfo->Bssid, 6); - *pLength += 6; - - // - // 6. Source MAC Address. - // - SET_AARPT_IAPPSRC(pIappPkt, Adapter->CurrentAddress, 6); - *pLength += 6; - - RT_PRINT_DATA(COMP_RM, DBG_LOUD, " ConstructCcxNeighborPoll:\n", Buffer, *pLength); -} - - -// -// Description: -// Construct the ARP response packet to support ARP offload. -// -VOID -ConstructARPResponse( - IN PADAPTER Adapter, - IN pu1Byte Buffer, - IN pu4Byte pLength, - IN pu1Byte pIPAddress - ) -{ - PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); - //PSTA_QOS pStaQos = pMgntInfo->pStaQos; - PRT_SECURITY_T pSecInfo = &(pMgntInfo->SecurityInfo); - pu1Byte pARPRspPkt = Buffer; - static u1Byte ARPLLCHeader[8] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00, 0x08, 0x06}; - - //------------------------------------------------------------------------- - // MAC Header. - //------------------------------------------------------------------------- - SET_80211_HDR_FRAME_CONTROL(pARPRspPkt, 0); - SET_80211_HDR_TYPE_AND_SUBTYPE(pARPRspPkt, Type_Data); - SET_80211_HDR_TO_DS(pARPRspPkt, 1); - SET_80211_HDR_ADDRESS1(pARPRspPkt, pMgntInfo->Bssid); - SET_80211_HDR_ADDRESS2(pARPRspPkt, Adapter->CurrentAddress); - SET_80211_HDR_ADDRESS3(pARPRspPkt, pMgntInfo->Bssid); - - SET_80211_HDR_DURATION(pARPRspPkt, 0); - SET_80211_HDR_FRAGMENT_SEQUENCE(pARPRspPkt, 0); - *pLength = sMacHdrLng; - -//YJ,del,120503 -#if 0 - //------------------------------------------------------------------------- - // Qos Header: leave space for it if necessary. - //------------------------------------------------------------------------- - if(pStaQos->CurrentQosMode > QOS_DISABLE) - { - SET_80211_HDR_QOS_EN(pARPRspPkt, 1); - PlatformZeroMemory(&(Buffer[*pLength]), sQoSCtlLng); - *pLength += sQoSCtlLng; - } -#endif - //------------------------------------------------------------------------- - // Security Header: leave space for it if necessary. - //------------------------------------------------------------------------- - if(pSecInfo->EncryptionHeadOverhead > 0) - { - PlatformZeroMemory(&(Buffer[*pLength]), pSecInfo->EncryptionHeadOverhead); - *pLength += pSecInfo->EncryptionHeadOverhead; - SET_80211_HDR_WEP(pARPRspPkt, 1); //Suggested by CCW. - } - - //------------------------------------------------------------------------- - // Frame Body. - //------------------------------------------------------------------------- - pARPRspPkt = (pu1Byte)(Buffer + *pLength); - // LLC header - PlatformMoveMemory(pARPRspPkt, ARPLLCHeader, 8); - *pLength += 8; - - // ARP element - pARPRspPkt += 8; - SET_ARP_PKT_HW(pARPRspPkt, 0x0100); - SET_ARP_PKT_PROTOCOL(pARPRspPkt, 0x0008); // IP protocol - SET_ARP_PKT_HW_ADDR_LEN(pARPRspPkt, 6); - SET_ARP_PKT_PROTOCOL_ADDR_LEN(pARPRspPkt, 4); - SET_ARP_PKT_OPERATION(pARPRspPkt, 0x0200); // ARP response - SET_ARP_PKT_SENDER_MAC_ADDR(pARPRspPkt, Adapter->CurrentAddress); - SET_ARP_PKT_SENDER_IP_ADDR(pARPRspPkt, pIPAddress); - SET_ARP_PKT_TARGET_MAC_ADDR(pARPRspPkt, Adapter->CurrentAddress); - SET_ARP_PKT_TARGET_IP_ADDR(pARPRspPkt, pIPAddress); - *pLength += 28; - - RT_PRINT_DATA(COMP_INIT, DBG_LOUD, "ConstructARPResponse():\n", Buffer, *pLength); -} - -VOID -ConstructCtsPacket( - IN PADAPTER Adapter, - IN pu1Byte Buffer, - IN pu4Byte pLength, - IN pu1Byte pStaAddr - ) -{ - pu1Byte pCts; - - RT_TRACE(COMP_MLME, DBG_LOUD, ("===> ConstructCtsPacket()\n")); - - pCts = Buffer; - - SET_80211_HDR_FRAME_CONTROL(pCts, 0); - SET_80211_HDR_TYPE_AND_SUBTYPE(pCts, Type_CTS); - SET_80211_HDR_DURATION(pCts, 0); - - SET_80211_HDR_ADDRESS1(pCts, pStaAddr); - - *pLength = 10; - - RT_TRACE(COMP_MLME, DBG_LOUD, ("<=== ConstructCtsPacket()\n")); -} - - -// -// Description: -// Construct the IP66 NS packet to support NS offload. -// -// buffer : -// Packet buffer -// pLength : -// Packet Length after construct -// PTAAdress : -// IPv6 , Target Link address ( MAC address ) -VOID -ConstructNSPacket( - IN PADAPTER Adapter, - IN pu1Byte Buffer, - IN pu4Byte pLength, - IN pu1Byte pTAAddress - ) -{ - PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); - //PSTA_QOS pStaQos = pMgntInfo->pStaQos; - PRT_SECURITY_T pSecInfo = &(pMgntInfo->SecurityInfo); - pu1Byte pNSRspPkt = Buffer; - static u1Byte NSLLCHeader[8] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00, 0x86, 0xDD}; - static u1Byte IPv6HeadInfo[4] = {0x60, 0x00, 0x00, 0x00}; - static u1Byte IPv6HeadContx[4] = {0x00, 0x20, 0x3a, 0xff}; - static u1Byte ICMPv6Head[8] = {0x88, 0x00, 0x00, 0x00 , 0x60 , 0x00 , 0x00 , 0x00}; - - //------------------------------------------------------------------------- - // MAC Header. - //------------------------------------------------------------------------- - SET_80211_HDR_FRAME_CONTROL(pNSRspPkt, 0); - SET_80211_HDR_TYPE_AND_SUBTYPE(pNSRspPkt, Type_Data); - SET_80211_HDR_TO_DS(pNSRspPkt, 1); - SET_80211_HDR_ADDRESS1(pNSRspPkt, pMgntInfo->Bssid); - SET_80211_HDR_ADDRESS2(pNSRspPkt, Adapter->CurrentAddress); - SET_80211_HDR_ADDRESS3(pNSRspPkt, pMgntInfo->Bssid); - - SET_80211_HDR_DURATION(pNSRspPkt, 0); - SET_80211_HDR_FRAGMENT_SEQUENCE(pNSRspPkt, 0); - *pLength = sMacHdrLng; - - -#if 0 - //------------------------------------------------------------------------- - // Qos Header: leave space for it if necessary. - //------------------------------------------------------------------------- - if(pStaQos->CurrentQosMode > QOS_DISABLE) - { - SET_80211_HDR_QOS_EN(pARPRspPkt, 1); - PlatformZeroMemory(&(Buffer[*pLength]), sQoSCtlLng); - *pLength += sQoSCtlLng; - } -#endif - //------------------------------------------------------------------------- - // Security Header: leave space for it if necessary. - //------------------------------------------------------------------------- - if(pSecInfo->EncryptionHeadOverhead > 0) - { - PlatformZeroMemory(&(Buffer[*pLength]), pSecInfo->EncryptionHeadOverhead); - *pLength += pSecInfo->EncryptionHeadOverhead; - SET_80211_HDR_WEP(pNSRspPkt, 1); //Suggested by CCW. - } - - //------------------------------------------------------------------------- - // Frame Body. - //------------------------------------------------------------------------- - pNSRspPkt = (pu1Byte)(Buffer + *pLength); - // LLC header - PlatformMoveMemory(pNSRspPkt, NSLLCHeader, 8); - pNSRspPkt += 8; - *pLength += 8; - - //------------------------------------------------------------------------- - // IPv6 Heard - //------------------------------------------------------------------------- - // 1 . Information (4 bytes): 0x60 0x00 0x00 0x00 - PlatformMoveMemory(pNSRspPkt, IPv6HeadInfo, 4); - pNSRspPkt += 4; - *pLength += 4; - // 2 . playload : 0x00 0x20 , NextProt : 0x3a (ICMPv6) HopLim : 0xff - PlatformMoveMemory(pNSRspPkt, IPv6HeadContx, 4); - pNSRspPkt += 4; - *pLength += 4; - // 3 . SA : 16 bytes , DA : 16 bytes ( Fw will filled ) - PlatformZeroMemory(pNSRspPkt , 32); - pNSRspPkt += 32; - *pLength += 32; - - //------------------------------------------------------------------------- - // ICMPv6 - //------------------------------------------------------------------------- - // 1. Type : 0x88 (NA) , Code : 0x00 , ChechSum : 0x00 0x00 (RSvd) NAFlag: 0x60 0x00 0x00 0x00 ( Solicited , Override) - PlatformMoveMemory(pNSRspPkt, ICMPv6Head, 8); - pNSRspPkt += 8; - *pLength += 8; - // 2. TA : 16 bytes - PlatformZeroMemory(pNSRspPkt , 16); - pNSRspPkt += 16; - *pLength += 16; - //------------------------------------------------------------------------- - // ICMPv6 Target Link Layer address - //------------------------------------------------------------------------- - pNSRspPkt[0] = 0x02 ; // Type - pNSRspPkt[1] = 0x01 ; // Len 1 unit of 8 octes - pNSRspPkt += 2; - *pLength += 2; - //PlatformMoveMemory(pNSRspPkt, pTAAddress, 6); - PlatformZeroMemory(pNSRspPkt , 6); - pNSRspPkt += 6; - *pLength += 6; - - RT_PRINT_DATA(COMP_INIT, DBG_LOUD, "ConstructNSPacket():\n", Buffer, *pLength); -} - -// -// Description: -// Construct SA Query request packet. -// [in] Adapter - -// The adapter context. -// [in] Buffer - -// The buffer for the constructed packet. -// [out] pLength - -// Return the length in byte for the constructed packet. -// [in] pTargetSta - -// Target STA which receives this frame. -// [in] Identifier - -// The identifier to fill in the SA query request. -// By Bruce, 2014-12-31. -// -VOID -ConstructSAQeuryReq( - IN PADAPTER Adapter, - IN pu1Byte Buffer, - IN pu4Byte pLength, - IN pu1Byte pTargetSta, - IN u2Byte Identifier - ) -{ - PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); - OCTET_STRING osFrame; - - RT_TRACE_F(COMP_SEC, DBG_LOUD, ("SA Identifier = 0x%04X\n", Identifier)); - - FillOctetString(osFrame, Buffer, 0); - - SET_80211_HDR_FRAME_CONTROL(osFrame.Octet, 0); - SET_80211_HDR_TYPE_AND_SUBTYPE(osFrame.Octet, Type_Action); - - SET_80211_HDR_ADDRESS1(osFrame.Octet, pTargetSta); - SET_80211_HDR_ADDRESS2(osFrame.Octet, Adapter->CurrentAddress); - SET_80211_HDR_ADDRESS3(osFrame.Octet, pMgntInfo->Bssid); - - SET_80211_HDR_DURATION(osFrame.Octet, 0); - SET_80211_HDR_FRAGMENT_SEQUENCE(osFrame.Octet, 0); - osFrame.Length = sMacHdrLng; - - SET_ACTFRAME_CATEGORY_CODE(osFrame.Octet, ACT_CAT_SAQ); - SET_ACTFRAME_ACTION_CODE(osFrame.Octet, ACT_SA_REQ); - SET_ACTFRAME_SA_QUERY_ID(osFrame.Octet, Identifier); - osFrame.Length += 4; - - *pLength = osFrame.Length; - - RT_PRINT_DATA((COMP_SEC), DBG_LOUD, ("ConstructSAQeuryReq:\n"), Buffer, *pLength); -} - - - -// -// Description: -// Construct SA Query response packet. -// [in] Adapter - -// The adapter context. -// [in] Buffer - -// The buffer for the constructed packet. -// [out] pLength - -// Return the length in byte for the constructed packet. -// [in] pTargetSta - -// Target STA which receives this frame. -// [in] Identifier - -// The identifier from the SA query request frame to fill in the SA query response. -// By Bruce, 2014-12-24. -// -VOID -ConstructSAQeuryRsp( - IN PADAPTER Adapter, - IN pu1Byte Buffer, - IN pu4Byte pLength, - IN pu1Byte pTargetSta, - IN u2Byte Identifier - ) -{ - PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); - OCTET_STRING osFrame; - - RT_TRACE_F(COMP_SEC, DBG_LOUD, ("SA Identifier = 0x%04X\n", Identifier)); - - FillOctetString(osFrame, Buffer, 0); - - SET_80211_HDR_FRAME_CONTROL(osFrame.Octet, 0); - SET_80211_HDR_TYPE_AND_SUBTYPE(osFrame.Octet, Type_Action); - - SET_80211_HDR_ADDRESS1(osFrame.Octet, pTargetSta); - SET_80211_HDR_ADDRESS2(osFrame.Octet, Adapter->CurrentAddress); - SET_80211_HDR_ADDRESS3(osFrame.Octet, pMgntInfo->Bssid); - - SET_80211_HDR_DURATION(osFrame.Octet, 0); - SET_80211_HDR_FRAGMENT_SEQUENCE(osFrame.Octet, 0); - osFrame.Length = sMacHdrLng; - - SET_ACTFRAME_CATEGORY_CODE(osFrame.Octet, ACT_CAT_SAQ); - SET_ACTFRAME_ACTION_CODE(osFrame.Octet, ACT_SA_RSP); - SET_ACTFRAME_SA_QUERY_ID(osFrame.Octet, Identifier); - osFrame.Length += 4; - - *pLength = osFrame.Length; - - RT_PRINT_DATA((COMP_SEC), DBG_LOUD, ("ConstructSAQeuryRsp:\n"), Buffer, *pLength); -} - -// -// Description: -// Append Fast Transition MD (Mobility Domain) IE to this packet. -// Arguments: -// [in] pAdapter - -// The location of target adapter. -// [in] contentType - -// The type of content to append packet. This field also indicates which type of posOutContent. -// CONTENT_PKT_TYPE_xxx - -// [in] pInfoBuf - -// This field is determined by contentType and shall be casted to the corresponding type. -// pInfoBuf is PRT_WLAN_BSS if contentType is CONTENT_PKT_TYPE_CLIENT. -// [in] InfoBufLen - -// Length in byte of pInfoBuf. -// [in] maxBufLen - -// The max length of posOutContent buffer in byte. -// [out] posOutContent - -// The OCTECT_STRING structure for the content buffer and length. -// posOutContent is a 802.11 packet if contentType is CONTENT_PKT_TYPE_802_11. -// Return: -// RT_STATUS_SUCCESS, if the content is appended withour error. -// RT_STATUS_BUFFER_TOO_SHORT, if the max length of buffer is not long enough. -// RT_STATUS_INVALID_STATE, if the security parameter is mismatched. -// Remark: -// To determine what to append to the output content, the pTargetBss, contentType, and posOutContent -// shall be filled when calling this function. If MD IE will be appended to an association request frame in posOutContent, -// the 802.11 packet type and MAC header shall be filled in posOutContent before calling this function. -// By Bruce, 2015-12-16. -// -RT_STATUS -FT_AppendMdIE( - IN PADAPTER pAdapter, - IN CONTENT_PKT_TYPE contentType, - IN PVOID pInfoBuf, - IN u4Byte InfoBufLen, - IN u4Byte maxBufLen, - OUT POCTET_STRING posOutContent - ) -{ - RT_STATUS rtStatus = RT_STATUS_SUCCESS; - PRT_SECURITY_T pSecInfo = &pAdapter->MgntInfo.SecurityInfo; - PFT_INFO_ENTRY pEntry = NULL; - OCTET_STRING osMdIe = {NULL, 0}; - PRT_WLAN_BSS pTargetBss = NULL; - u1Byte pktType = 0xFF; - - CHECK_NULL_RETURN_STATUS(posOutContent); - - do - { - if(TEST_FLAG(contentType, CONTENT_PKT_TYPE_CLIENT | CONTENT_PKT_TYPE_AP | CONTENT_PKT_TYPE_IBSS)) - { - if(RT_SEC_LVL_WPA2 != pSecInfo->SecLvl) - { - RT_TRACE_F(COMP_SEC, DBG_WARNING, ("SecLvl (%d) != RT_SEC_LVL_WPA2\n", pSecInfo->SecLvl)); - rtStatus = RT_STATUS_INVALID_STATE; - break; - } - } - - if(TEST_FLAG(contentType, CONTENT_PKT_TYPE_802_11)) - { - pktType = PacketGetType(*posOutContent); - } - - if(TEST_FLAG(contentType, CONTENT_PKT_TYPE_CLIENT)) - { - if(!pInfoBuf || InfoBufLen < sizeof(RT_WLAN_BSS)) - { - RT_TRACE_F(COMP_SEC, DBG_SERIOUS, ("Invalid input buffer or length, pInfoBuf = %p, InfoBufLen = %d\n", pInfoBuf, InfoBufLen)); - rtStatus = RT_STATUS_INVALID_DATA; - break; - } - pTargetBss = (PRT_WLAN_BSS)pInfoBuf; - - if(NULL == (pEntry = FtGetEntry(pAdapter, pTargetBss->bdBssIdBuf))) - { - RT_PRINT_ADDR(COMP_MLME, DBG_LOUD, "FT_AppendMdIE() No Entry for BSSID = ", pTargetBss->bdBssIdBuf); - rtStatus = RT_STATUS_INVALID_STATE; - break; - } - - // Do not append RSN IE in default. - rtStatus = RT_STATUS_INVALID_DATA; - switch(pktType) - { - default: - rtStatus = RT_STATUS_INVALID_DATA; - break; - - case Type_Auth: - { - if(pEntry) - { - if(pEntry->PMKR0NameLen > 0 && pEntry->FTELen > 0 && pEntry->MDELen) - { - rtStatus = RT_STATUS_SUCCESS; - } - } - } - break; - - case Type_Asoc_Req: - case Type_Reasoc_Req: - rtStatus = RT_STATUS_SUCCESS; - break; - } - - if(RT_STATUS_SUCCESS != rtStatus) - { - // No need to append This IE - RT_TRACE_F(COMP_MLME, DBG_TRACE, ("pktType = 0x%02X, no need to append MD IE\n", pktType)); - break; - } - - // MD Element - FillOctetString(osMdIe, pEntry->MDE, (u2Byte)(pEntry->MDELen)); - } - else - { - //3 // ToDo: Support AP mode later. - rtStatus = RT_STATUS_NOT_SUPPORT; - break; - } - - if(maxBufLen < ((u4Byte)posOutContent->Length + osMdIe.Length)) - { - RT_TRACE_F(COMP_MLME, DBG_WARNING, ("maxBufLen (%d) <= packet + MDIE len (%d)\n", maxBufLen, (posOutContent->Length + osMdIe.Length))); - rtStatus = RT_STATUS_BUFFER_TOO_SHORT; - break; - } - RT_PRINT_DATA(COMP_MLME, DBG_LOUD, "FT_AppendMdIE() Append MDIE:\n", osMdIe.Octet, osMdIe.Length); - AppendAdditionalIEs(posOutContent, osMdIe); - }while(FALSE); - - FunctionOut(COMP_MLME); - - return rtStatus; -} - -// -// Description: -// Append Fast Transition FT (Fast BSS transition) IE to this packet. -// Arguments: -// [in] pAdapter - -// The location of target adapter. -// [in] contentType - -// The type of content to append packet. This field also indicates which type of posOutContent. -// CONTENT_PKT_TYPE_xxx - -// [in] pInfoBuf - -// This field is determined by contentType and shall be casted to the corresponding type. -// pInfoBuf is PRT_WLAN_BSS if contentType is CONTENT_PKT_TYPE_CLIENT. -// [in] InfoBufLen - -// Length in byte of pInfoBuf. -// [in] maxBufLen - -// The max length of posOutContent buffer in byte. -// [out] posOutContent - -// The OCTECT_STRING structure for the content buffer and length. -// posOutContent is a 802.11 packet if contentType is CONTENT_PKT_TYPE_802_11. -// Return: -// RT_STATUS_SUCCESS, if the content is appended withour error. -// RT_STATUS_BUFFER_TOO_SHORT, if the max length of buffer is not long enough. -// RT_STATUS_INVALID_STATE, if the security parameter is mismatched. -// Remark: -// To determine what to append to the output content, the pTargetBss, contentType, and posOutContent -// shall be filled when calling this function. If FT IE will be appended to an association request frame in posOutContent, -// the 802.11 packet type and MAC header shall be filled in posOutContent before calling this function. -// By Bruce, 2015-12-16. -// -RT_STATUS -FT_AppendFtIE( - IN PADAPTER pAdapter, - IN CONTENT_PKT_TYPE contentType, - IN PVOID pInfoBuf, - IN u4Byte InfoBufLen, - IN u4Byte maxBufLen, - OUT POCTET_STRING posOutContent - ) -{ - RT_STATUS rtStatus = RT_STATUS_SUCCESS; - PRT_SECURITY_T pSecInfo = &pAdapter->MgntInfo.SecurityInfo; - PFT_INFO_ENTRY pEntry = NULL; - OCTET_STRING osFtIe = {NULL, 0}; - PRT_WLAN_BSS pTargetBss = NULL; - u1Byte pktType = 0xFF; - - CHECK_NULL_RETURN_STATUS(posOutContent); - - do - { - if(TEST_FLAG(contentType, CONTENT_PKT_TYPE_CLIENT | CONTENT_PKT_TYPE_AP | CONTENT_PKT_TYPE_IBSS)) - { - if(RT_SEC_LVL_WPA2 != pSecInfo->SecLvl) - { - RT_TRACE_F(COMP_SEC, DBG_WARNING, ("SecLvl (%d) != RT_SEC_LVL_WPA2\n", pSecInfo->SecLvl)); - rtStatus = RT_STATUS_INVALID_STATE; - break; - } - } - - if(TEST_FLAG(contentType, CONTENT_PKT_TYPE_802_11)) - { - pktType = PacketGetType(*posOutContent); - } - - if(TEST_FLAG(contentType, CONTENT_PKT_TYPE_CLIENT)) - { - if(!pInfoBuf || InfoBufLen < sizeof(RT_WLAN_BSS)) - { - RT_TRACE_F(COMP_SEC, DBG_SERIOUS, ("Invalid input buffer or length, pInfoBuf = %p, InfoBufLen = %d\n", pInfoBuf, InfoBufLen)); - rtStatus = RT_STATUS_INVALID_DATA; - break; - } - pTargetBss = (PRT_WLAN_BSS)pInfoBuf; - - if(NULL == (pEntry = FtGetEntry(pAdapter, pTargetBss->bdBssIdBuf))) - { - RT_PRINT_ADDR(COMP_MLME, DBG_LOUD, "FT_AppendMdIE() No Entry for BSSID = ", pTargetBss->bdBssIdBuf); - rtStatus = RT_STATUS_INVALID_STATE; - break; - } - - // Do not append RSN IE in default. - rtStatus = RT_STATUS_INVALID_DATA; - switch(pktType) - { - default: - rtStatus = RT_STATUS_INVALID_DATA; - break; - - case Type_Auth: - { - if(pEntry) - { - if(pEntry->PMKR0NameLen > 0 && pEntry->FTELen > 0 && pEntry->MDELen) - { - rtStatus = RT_STATUS_SUCCESS; - } - } - } - break; - - case Type_Asoc_Req: - case Type_Reasoc_Req: - rtStatus = RT_STATUS_SUCCESS; - break; - } - - if(RT_STATUS_SUCCESS != rtStatus) - { - // No need to append This IE - RT_TRACE_F(COMP_MLME, DBG_TRACE, ("pktType = 0x%02X, no need to append Ft IE\n", pktType)); - break; - } - - // MD Element - FillOctetString(osFtIe, pEntry->FTE, (u2Byte)(pEntry->FTELen)); - } - else - { - //3 // ToDo: Support AP mode later. - rtStatus = RT_STATUS_NOT_SUPPORT; - break; - } - - if(maxBufLen < ((u4Byte)posOutContent->Length + osFtIe.Length)) - { - RT_TRACE_F(COMP_MLME, DBG_WARNING, ("maxBufLen (%d) <= packet + FTIE len (%d)\n", maxBufLen, (posOutContent->Length + osFtIe.Length))); - rtStatus = RT_STATUS_BUFFER_TOO_SHORT; - break; - } - RT_PRINT_DATA(COMP_MLME, DBG_LOUD, "FT_AppendFtIE() Append FTIE:\n", osFtIe.Octet, osFtIe.Length); - AppendAdditionalIEs(posOutContent, osFtIe); - }while(FALSE); - - FunctionOut(COMP_MLME); - - return rtStatus; -} - |
