--- /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<WHA::SChannels*>(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;
+ }