diff -r 000000000000 -r c40eb8fe8501 wlan_bearer/wlanldd/wlan_common/umac_common/src/umacwhatodot11typeconverter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/src/umacwhatodot11typeconverter.cpp Tue Feb 02 02:03:13 2010 +0200 @@ -0,0 +1,271 @@ +/* +* Copyright (c) 2005-2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Converter between WHA types and dot11 types. +* +*/ + +/* +* %version: 10 % +*/ + +#include "config.h" +#include "umacwhatodot11typeconverter.h" +#include "802dot11.h" +#include "UmacContextImpl.h" + +struct TWhaRate2Dot11Rate + { + WHA::TRate iWhaRate; + T802Dot11SupportedRate iDot11Rate; + }; + +const TWhaRate2Dot11Rate KWhaRate2Dot11RateTable[] = + { + { WHA::KRate1Mbits, E802Dot11Rate1MBit }, + { WHA::KRate2Mbits, E802Dot11Rate2MBit }, + { WHA::KRate5_5Mbits, E802Dot11Rate5p5MBit }, + { WHA::KRate6Mbits, E802Dot11Rate6MBit }, + { WHA::KRate9Mbits, E802Dot11Rate9MBit }, + { WHA::KRate11Mbits, E802Dot11Rate11MBit }, + { WHA::KRate12Mbits, E802Dot11Rate12MBit }, + { WHA::KRate18Mbits, E802Dot11Rate18MBit }, + { WHA::KRate22Mbits, E802Dot11Rate22MBit }, + { WHA::KRate24Mbits, E802Dot11Rate24MBit }, + { WHA::KRate33Mbits, E802Dot11Rate33MBit }, + { WHA::KRate36Mbits, E802Dot11Rate36MBit }, + { WHA::KRate48Mbits, E802Dot11Rate48MBit }, + { WHA::KRate54Mbits, E802Dot11Rate54MBit }, + }; + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void WlanWhaToDot11TypeConverter::Convert( + WHA::TRate aRateMask, + SSupportedRatesIE& aRateIe, + SExtendedSupportedRatesIE& aExtRateIe ) + { + aRateIe.Clear(); // make zero length + aExtRateIe.Clear(); + + const TWhaRate2Dot11Rate* pos = KWhaRate2Dot11RateTable; + const TWhaRate2Dot11Rate* end = + pos + sizeof(KWhaRate2Dot11RateTable) / sizeof( TWhaRate2Dot11Rate); + + TUint32 cntr( 0 ); + while ( pos != end ) + { + if ( aRateMask & pos->iWhaRate ) + { + // we have a hit + if ( cntr < KMaxNumberOfRates ) + { + // space left in this IE + aRateIe.Append( pos->iDot11Rate ); + } + else + { + // have to use the extended rates IE + aExtRateIe.Append( pos->iDot11Rate ); + } + ++cntr; + } + else + { + // no hit + } + + ++pos; + } + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +TBool WlanWhaToDot11TypeConverter::ConvertToWhaTypes( + WlanContextImpl& aCtxImpl, + const TSSID* aSsid, + WHA::SSSID& aWhaSsid, + const SChannels* aChannels, + TUint32 aMinChannelTime, + TUint32 aMaxChannelTime, + WHA::SChannels*& aWhaChannels, + TUint8& aWhaChannelCount ) + { + const TUint32 endMask2dot4 = 0x00004000; + const TUint32 endMask4dot9 = 0x00100000; + + TBool status ( ETrue ); + + // ========================================================================= + // handle SSID + // ========================================================================= + + aWhaSsid.iSSIDLength = aSsid->ssidLength; + os_memcpy( aWhaSsid.iSSID, aSsid->ssid, aWhaSsid.iSSIDLength ); + + + // ========================================================================= + // handle channels & bands + // Note that only one band is allowed to be specified at a time + // ========================================================================= + + OsTracePrint( KScan, (TUint8*) + ("UMAC: WlanWhaToDot11TypeConverter::ConvertToWhaTypes: frequency band mask: 0x%02x"), + aChannels->iBand ); + + TUint32 channelMask ( 0 ); + aWhaChannelCount = 0; + + if ( aChannels->iBand & WHA::KBand2dot4GHzMask ) + { + // channels in the 2.4GHz band + // + + channelMask = aChannels->iChannels2dot4GHz[1]; // HI part + channelMask <<= 8; + channelMask |= aChannels->iChannels2dot4GHz[0]; // LO part + + // so how many channels have been specified to be scanned + for ( TUint32 bit = 1; !(bit & endMask2dot4); bit <<= 1 ) + { + if ( channelMask & bit ) + { + ++aWhaChannelCount; + } + } + } + else if ( aChannels->iBand & WHA::KBand4dot9GHzMask ) + { + // channels in the 4.9GHz band + // + + channelMask = aChannels->iChannels4dot9GHz[2]; + channelMask <<= 8; + channelMask |= aChannels->iChannels4dot9GHz[1]; + channelMask <<= 8; + channelMask |= aChannels->iChannels4dot9GHz[0]; + + // so how many channels have been specified to be scanned + for ( TUint32 bit = 1; !(bit & endMask4dot9); bit <<= 1 ) + { + if ( channelMask & bit ) + { + ++aWhaChannelCount; + } + } + } + else + { + OsTracePrint( + KErrorLevel, + (TUint8*) + ("UMAC: WlanWhaToDot11TypeConverter::ConvertToWhaTypes: ERROR: neither 2.4 nor 4.9 GHz band specified")); + + // implementation error + OsAssert( (TUint8*)("UMAC: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); + } + + OsTracePrint( + KScan, (TUint8*) + ("UMAC: WlanWhaToDot11TypeConverter::ConvertToWhaTypes: channel bitmask: 0x%04x"), + channelMask ); + OsTracePrint( + KScan, (TUint8*) + ("UMAC: WlanWhaToDot11TypeConverter::ConvertToWhaTypes: %d channels specified to be scanned"), + aWhaChannelCount ); + + if ( !aWhaChannelCount ) + { + // no channels specified to be scanned. That's an implementation error + + OsTracePrint( KErrorLevel, (TUint8*) + ("UMAC: WlanWhaToDot11TypeConverter::ConvertToWhaTypes: ERROR: no channels specified to be scanned") ); + OsAssert( (TUint8*)("UMAC: panic"), (TUint8*)(WLAN_FILE), __LINE__ ); + } + + // allocate memory for the channels + aWhaChannels = + static_cast(os_alloc( + sizeof( WHA::SChannels ) * aWhaChannelCount )); + WHA::SChannels* ptr = aWhaChannels; + + if ( !aWhaChannels ) + { + // alloc failed; we can't continue + status = EFalse; + } + else // alloc success, continue + { + // convert to WHA channels + // + + WHA::TChannelNumber channelNumber( 1 ); + + if ( aChannels->iBand & WHA::KBand2dot4GHzMask ) + { + for ( TUint32 bit = 1; !(bit & endMask2dot4); bit <<= 1 ) + { + if ( channelMask & bit ) + { + ptr->iChannel = channelNumber; + ptr->iMinChannelTime = aMinChannelTime; + ptr->iMaxChannelTime = aMaxChannelTime; + ptr->iTxPowerLevel = aCtxImpl.iWlanMib.dot11CurrentTxPowerLevel; + ++ptr; + } + ++channelNumber; + } + } + else if ( aChannels->iBand & WHA::KBand4dot9GHzMask ) + { + for ( TUint32 bit = 1; !(bit & endMask4dot9); bit <<= 1 ) + { + if ( channelMask & bit ) + { + ptr->iChannel = channelNumber; + ptr->iMinChannelTime = aMinChannelTime; + ptr->iMaxChannelTime = aMaxChannelTime; + ptr->iTxPowerLevel = aCtxImpl.iWlanMib.dot11CurrentTxPowerLevel; + ++ptr; + } + ++channelNumber; + } + } + +#ifndef NDEBUG + // trace WHA channels + ptr = aWhaChannels; + OsTracePrint( + KScan, + (TUint8*) + ("UMAC: WlanWhaToDot11TypeConverter::ConvertToWhaTypes: dump channels")); + + for ( TUint8 index = 0; index < aWhaChannelCount; ++index ) + { + OsTracePrint( + KScan, (TUint8*) + ("UMAC: WlanWhaToDot11TypeConverter::ConvertToWhaTypes: channelNumber: %d "), + ptr->iChannel ); + ++ptr; + } +#endif + } // else (alloc success) + + return status; + }