diff -r 000000000000 -r c40eb8fe8501 wlan_bearer/wlanldd/wlan_common/umac_common/inc/UmacDot11Associated.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wlan_bearer/wlanldd/wlan_common/umac_common/inc/UmacDot11Associated.h Tue Feb 02 02:03:13 2010 +0200 @@ -0,0 +1,681 @@ +/* +* Copyright (c) 2005-2009 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: Declaration of the WlanDot11Associated class +* +*/ + +/* +* %version: 46 % +*/ + +#ifndef WLANDOT11ASSOCIATED_H +#define WLANDOT11ASSOCIATED_H + +#include "UmacDot11State.h" +#include "FrameXferBlock.h" +#include "umacinternaldefinitions.h" + +class TWlanUserTxDataCntx; + +/** +* This is a state where STA has entered to state where +* it is able send MPDU's to a network +*/ +class WlanDot11Associated : public WlanDot11State + { +public: + + /** + * Transmit a protocol stack frame + * + * The frame to be sent needs to be in 802.3 format + * @param aCtxImpl global state machine context + * @param aDataBuffer meta header of the frame to be transmitted + * @param aMore ETrue if another frame is also ready to be transmitted + * EFalse otherwise + */ + virtual TBool TxData( + WlanContextImpl& aCtxImpl, + TDataBuffer& aDataBuffer, + TBool aMore ); + + virtual TAny* RequestForBuffer( + WlanContextImpl& aCtxImpl, + TUint16 aLength ); + + virtual void ReceivePacket( + WlanContextImpl& aCtxImpl, + WHA::TStatus aStatus, + const void* aFrame, + TUint16 aLength, + WHA::TRate aRate, + WHA::TRcpi aRcpi, + WHA::TChannelNumber aChannel, + TUint8* aBuffer, + TUint32 aFlags ); + +protected: + + /** + * C++ default constructor. + */ + WlanDot11Associated() {}; + + /** + * Destructor. + */ + virtual ~WlanDot11Associated() {}; + + virtual void DoSetTxMpduDaAddress( + SDataFrameHeader& aDataFrameHeader, + const TMacAddress& aMac ) const = 0; + + virtual TBool DoIsRxFrameSAourAddress( + WlanContextImpl& aCtxImpl, + const SDataFrameHeader& aFrameHeader, + const SAmsduSubframeHeader* aSubFrameHeader = NULL ) const = 0; + + /** + * Called to check is To/From DS bit combination valid + + * @return ETrue valid combination, EFalse else + */ + virtual TBool DoIsValidAddressBitCombination( + const SDataFrameHeader& aFrameHeader ) const = 0; + + virtual void DoBuildEthernetFrame( + TDataBuffer& aBuffer, + const SDataMpduHeader& aDot11DataMpdu, + const TUint8* aStartOfEtherPayload, + TUint aEtherPayloadLength, + TBool aAmsdu, + TUint8* aCopyBuffer ) = 0; + + /** + * Handles a received frame having a proprietary SNAP header + * + * @since S60 3.1 + * @param aBuffer meta header for the Rx frame + * @param aQosData ETrue if this is a QoS data frame + * @param aFrame pointer to the start of the frame + * @param aSubFrameHeader Pointer to the beginning of the subframe header. + * NULL if the MSDU is not a subframe within an A-MSDU + * @param aLength frame length + * @param aDecryptHeaderLen length of the decrypt header of the + * frame (e.g. IV etc.) + * @param aDecryptTrailerLen length of the decrypt trailer of the + * frame (e.g. MIC etc.) + * @param aHtControlLen length of the HT Control field of the + * frame's MAC header; or zero if field is not present + * @param aCopyBuffer If not NULL, the frame is part of an A-MSDU + * and it needs to be copied to the buffer denoted by this + * pointer + */ + void HandleProprietarySnapRxFrame( + TDataBuffer& aBuffer, + TBool aQosData, + const TAny* const aFrame, + const SAmsduSubframeHeader* aSubFrameHeader, + TUint aLength, + TUint aDecryptHeaderLen, + TUint aDecryptTrailerLen, + TUint aHtControlLen, + TUint8* aCopyBuffer ) const; + + /** + * Called upon receiving a beacon frame + * @param aCtxImpl statemachine context + * @param aRcpi RCPI of the frame + * @param aBuffer pointer to the beginning of the Rx buffer allocated + * for the frame + */ + virtual void OnBeaconFrameRx( + WlanContextImpl& aCtxImpl, + const TAny* aFrame, + const TUint32 aLength, + WHA::TRcpi aRcpi, + TUint8* aBuffer ); + + /** + * Called upon receiving a probe response frame + * @param aCtxImpl statemachine context + * @param aRcpi RCPI of the frame + * @param aBuffer pointer to the beginning of the Rx buffer allocated + * for the frame + */ + virtual void OnProbeResponseFrameRx( + WlanContextImpl& aCtxImpl, + const TAny* aFrame, + const TUint32 aLength, + WHA::TRcpi aRcpi, + TUint8* aBuffer ); + + /** + * Called upon receiving a deauthentication frame + * @param aCtxImpl statemachine context + * @param aBuffer pointer to the beginning of the Rx buffer allocated + * for the frame + */ + virtual void OnDeauthenticateFrameRx( + WlanContextImpl& aCtxImpl, + TUint8* aBuffer ); + + /** + * Called upon receiving a disassociation frame + * @param aCtxImpl statemachine context + * @param aBuffer pointer to the beginning of the Rx buffer allocated + * for the frame + */ + virtual void OnDisassociateFrameRx( + WlanContextImpl& aCtxImpl, + TUint8* aBuffer ); + + /** + * Determines if the received 802.11 Data MPDU - excluding the contained + * MSDU or A-MSDU - is valid + * @param aLength Length of the MPDU + * @param aFrameHeader MAC header of the MPDU + * @param aQosData ETrue if the MPDU is a QoS Data frame + * EFalse othwerwise + * @param aAmsdu ETrue if the MPDU contains an A-MSDU + * EFalse othwerwise + * @param aHtControlLen Length of the HT Control field in the MPDU's MAC + * header. Zero if the field is not present + * @param aSecurityHeaderLen Length of the security header of the MPDU. + * Zero if the payload is not encrypted + * @param aSecurityTrailerLen Length of the security trailer of the MPDU. + * Zero if the payload is not encrypted + * @return ETrue if the MPDU is valid, EFalse otherwise + */ + inline TBool RxDataMpduValid( + const TUint32 aLength, + const SDataFrameHeader& aFrameHeader, + TBool aQosData, + TBool aAmsdu, + TUint aHtControlLen, + TUint aSecurityHeaderLen, + TUint aSecurityTrailerLen ) const; + + /** + * Determines the minimum length that the received 802.11 Data MPDU must + * have so that we are able to process is + * @param aQosData ETrue if the frame is a QoS Data frame + * EFalse othwerwise + * @param aAmsdu ETrue if the MPDU contains an A-MSDU + * EFalse othwerwise + * @param aHtControlLen Length of the HT Control field in the MPDU's MAC + * header. Zero if the field is not present + * @param aSecurityHeaderLen Length of the security header of the MPDU. + * Zero if the payload is not encrypted + * @param aSecurityTrailerLen Length of the security trailer of the MPDU. + * Zero if the payload is not encrypted + * @return + */ + inline TUint MinAcceptableRxDataMpduLen( + TBool aQosData, + TBool aAmsdu, + TUint aHtControlLen, + TUint aSecurityHeaderLen, + TUint aSecurityTrailerLen ) const; + + /** + * Determines whether the Destination Address (DA) of the received MPDU is + * a unicast, a brodcast or a multicast (but not a broadcast) address + * @param aFrameHeader MAC header of the MPDU + * @return See above + */ + inline TDaType RxFrameDaType( + const SDataFrameHeader& aFrameHeader ) const; + + /** + * Determines if the received MSDU is valid to be forwarded to the + * relevant client + * @param aCtxImpl statemachine context + * @param aFrameHeader MAC header of the MPDU encapsulating the MSDU + * @param aSubFrameHeader Pointer to the beginning of the subframe header. + * NULL if the MSDU is not a subframe within an A-MSDU + * @param aStartOfSnap Pointer to the beginning of the SNAP header + * @param aEtherType Ethernet type of the received MSDU + * @param aMulticast ETrue if the frame is a multicast, EFalse otherwise + * @param aFlags Flags from WHA frame receive method + * @param aSnapstatus Result of the SNAP header check of the received MSDU + * @return ETrue if the MSDU is valid, EFalse otherwise + */ + inline TBool RxMsduValid( + WlanContextImpl& aCtxImpl, + const SDataFrameHeader& aFrameHeader, + const SAmsduSubframeHeader* aSubFrameHeader, + const TUint8* aStartOfSnap, + TUint16 aEtherType, + TBool aMulticast, + TUint32 aFlags, + TSnapStatus& aSnapStatus ) const; + + /** + * Determines the Ethernet payload length of an MSDU, which may or may not + * be a part of an A-MSDU + * @param aMpduLength Length of the received MPDU + * @param aSubframeLength Length of the A-MSDU subframe. Zero if the MPDU + * doesn't contain an A-MSDU + * @param aQosData ETrue if the frame is a QoS Data frame + * EFalse othwerwise + * @param aHtControlLen Length of the HT Control field in the MPDU's MAC + * header. Zero if the field is not present + * @param aSecurityHeaderLen Length of the security header of the MPDU. + * Zero if the payload is not encrypted + * @param aSecurityTrailerLen Length of the security trailer of the MPDU. + * Zero if the payload is not encrypted + * @return Ethernet payload length of the MSDU + */ + inline TUint RxMsduEthernetPayloadLength( + const TUint32 aMpduLength, + TUint aSubframeLength, + TBool aQosData, + TUint aHtControlLen, + TUint aSecurityHeaderLen, + TUint aSecurityTrailerLen ) const; + + /** + * Allocates a new Rx buffer for a frame to be forwarded to WLAN Mgmt client + * @param aCtxImpl statemachine context + * @param aProprieatarySnapFrame ETrue if the frame contains a proprietary + * SNAP header, EFalse othwerwise + * @param aQosFrame ETrue if the frame is a QoS Data frame + * EFalse othwerwise + * @param aHtControlLen Length of the HT Control field in the frame's MAC + * header. Zero if the field is not present + * @param aEtherPayloadLength Length of the frame's Ethernet payload + * @return Pointer to the beginning of the allocated buffer + * NULL if allocation is unsuccessful + */ + inline TUint8* NewBufForMgmtClientRxFrame( + WlanContextImpl& aCtxImpl, + TBool aProprieatarySnapFrame, + TBool aQosFrame, + TUint aHtControlLen, + TUint aEtherPayloadLength ) const; + + /** + * Determines if the received MSDU is for the protocol stack client + * @param aEtherType Ethernet type of the received MSDU + * @param aSnapstatus Result of the SNAP header check of the received MSDU + * @return ETrue if the MSDU is for the protocol stack client + * EFalse if the MSDU is for the WLAN Mgmt client + */ + inline TBool RxMsduForUser( + TUint16 aEtherType, + TSnapStatus aSnapstatus ) const; + + /** + * Updates 802.11 Data frame Rx statistics + * @param aCtxImpl statemachine context + * @param aEtherType Ethernet type of the received frame + * @param aMulticast ETrue if the frame is a multicast, EFalse otherwise + * @param aAccessCategory Access Category of the received frame + */ + inline void UpdateDataFrameRxStatistics( + WlanContextImpl& aCtxImpl, + TUint16 aEtherType, + TBool aMulticast, + WHA::TQueueId aAccessCategory ) const; + + /** + * Called upon receiving a dot11 data MPDU + * @param aCtxImpl statemachine context + * @param aFlags Flags from WHA frame receive method + * @param aRcpi RCPI of the frame + * @param aBuffer pointer to the beginning of the Rx buffer allocated + * for the frame + */ + virtual void OnDataFrameRx( + WlanContextImpl& aCtxImpl, + const TAny* aFrame, + const TUint32 aLength, + TUint32 aFlags, + WHA::TRcpi aRcpi, + TUint8* aBuffer ); + + /** + * Called upon receiving a 802.11 Management Action frame. + * + * @since S60 3.2 + * @param aCtxImpl statemachine context + * @param aFrame Pointer to the beginning of the received frame + * @param aLength Length of the frame. Measured from the first byte of + * the MAC header to the last byte of the frame body + * @param aRcpi Received channel power indicator + * @param aBuffer pointer to the beginning of the Rx buffer allocated + * for the frame + */ + void OnManagementActionFrameRx( + WlanContextImpl& aCtxImpl, + const TAny* aFrame, + const TUint32 aLength, + WHA::TRcpi aRcpi, + TUint8* aBuffer ) const; + + void EncapsulateFrame( + WlanContextImpl& aCtxImpl, + TWlanUserTxDataCntx& aDataCntx, + TDataBuffer& aDataBuffer, + TUint16& aEtherType ); + + /** + * Determines if Tx frames need to be encrypted + * + * @since S60 3.2 + * @param aCtxImpl statemachine context + * @param aDataBuffer meta header of the frame to be transmitted + * @return ETrue if Tx frames need to be encrypted + * EFalse otherwise + */ + TBool EncryptTxFrames( + WlanContextImpl& aCtxImpl, + const TDataBuffer& aDataBuffer ) const; + + /** + * Determines the space in bytes to be reserved for the security header + * in the MPDU to be transmitted + * + * @param aCtxImpl statemachine context + * @param aDataBuffer meta header of the frame to be transmitted + * @return See above + */ + TUint ComputeEncryptionOffsetAmount( + const WlanContextImpl& aCtxImpl, + const TDataBuffer& aDataBuffer ) const; + + /** + * Determines the space in bytes to be reserved for the security trailer + * in the MPDU to be transmitted + * + * @param aCtxImpl statemachine context + * @param aDataBuffer meta header of the frame to be transmitted + * @return See above + */ + TUint EncryptTrailerLength( + WlanContextImpl& aCtxImpl, + const TDataBuffer& aDataBuffer ) const; + + TUint ComputeQosOffsetAmount( WlanContextImpl& aCtxImpl ) const; + + TUint DecryptHdrOffset( + WlanContextImpl& aCtxImpl, + TUint32 aFlags ) const; + + TUint DecryptTrailerOffset( + WlanContextImpl& aCtxImpl, + TUint32 aFlags ) const; + + /** + * Checks the validity of SNAP header + * + * @since S60 3.1 + * @param aCtxImpl statemachine context + * @param aStartOfSnap is a pointer to the start of the SNAP header + */ + TSnapStatus ValiDateSnapHeader( + WlanContextImpl& aCtxImpl, + const TUint8* aStartOfSnap ) const; + + void EncapsulateEthernetFrame( + WlanContextImpl& aCtxImpl, + TWlanUserTxDataCntx& aDataCntx, + TDataBuffer& aDataBuffer, + TUint16& aEtherType ) const; + + /** + * Encapsulates a frame starting with a proprietary SNAP header inside an + * MPDU + * + * @since S60 3.1 + * @param aCtxImpl global statemachine context + * @param aDataCntx user Tx frame context + * @param aDataBuffer meta header of the frame to be transmitted + * @param aEncrypt ETrue if the frame needs to be encrypted + * EFalse otherwise + * @param aEncryptionOffset Length (bytes) to be reserved for the + * encryption header + * @param aEncryptTrailerLength Length (bytes) to be reserved for the + * encryption trailer + * @param aQosOffset Length (bytes) to be reserved for the + * QoS Control field + * @param aHtControlOffset Length (bytes) to be reserved for the + * HT Control field + */ + void EncapsulateSnapFrame( + WlanContextImpl& aCtxImpl, + TWlanUserTxDataCntx& aDataCntx, + TDataBuffer& aDataBuffer, + TBool aEncrypt, + TUint aEncryptionOffset, + TUint aEncryptTrailerLength, + TUint aQosOffset, + TUint aHtControlOffset ) const; + + /** + * Sets a ready made 802.11 frame to Tx buffer + * + * @since S60 3.2 + * @param aCtxImpl global statemachine context + * @param aDataCntx user Tx frame context + * @param aDataBuffer meta header of the frame to be transmitted + */ + void SetDot11FrameToTxBuffer( + const WlanContextImpl& aCtxImpl, + TWlanUserTxDataCntx& aDataCntx, + TDataBuffer& aDataBuffer ) const; + + /** + * Indicates Consecutive Beacons Lost + * to WLAN Mgmt Client; if necessary + * + * @since S60 5.0 + * @param aCtxImpl global statemachine context + */ + virtual void DoConsecutiveBeaconsLostIndication( WlanContextImpl& aCtxImpl ); + + /** + * Indicates Consecutive Tx Failures + * to WLAN Mgmt Client; if necessary + * + * @since S60 5.0 + * @param aCtxImpl global statemachine context + */ + virtual void DoConsecutiveTxFailuresIndication( WlanContextImpl& aCtxImpl ); + + virtual void DoRegainedBSSIndication( WlanContextImpl& aCtxImpl ); + + virtual void OnPacketSendComplete( + WlanContextImpl& aCtxImpl, + WHA::TStatus aStatus, + TUint32 aPacketId, + WHA::TRate aRate, + TUint32 aPacketQueueDelay, + TUint32 aMediaDelay, + TUint aTotalTxDelay, + TUint8 aAckFailures, + WHA::TQueueId aQueueId, + WHA::TRate aRequestedRate, + TBool aMulticastData ); + + /** + * Adds a multicast MAC address and starts to filter (Rx) multicast + * traffic sent to any other MAC addresses than those that have been + * specified using this method + * @param aCtxImpl statemachine context + * @param aMacAddr The address to be added + * @return ETrue if a state change occurred in the state machine + * EFalse otherwise + */ + virtual TBool AddMulticastAddr( + WlanContextImpl& aCtxImpl, + const TMacAddress& aMacAddr ); + + /** + * Removes a multicast MAC address from multicast (Rx) filtering + * configuration. So any packet that we receive and which has been sent + * to the multicast address in question is not accepted any more (i.e. + * it is filtered). + * However, if there are no addresses left in the multicast (Rx) filtering + * configuration after this remove, the multicast filtering is disabled + * and all (otherwise acceptable) multicast packets are accepted again. + * @param aCtxImpl statemachine context + * @param aMacAddr The address to be removed + * @return ETrue if a state change occurred in the state machine + * EFalse otherwise + */ + virtual TBool RemoveMulticastAddr( + WlanContextImpl& aCtxImpl, + TBool aRemoveAll, + const TMacAddress& aMacAddr ); + + /** + * From MWlanUserEvent + * Add/set (or replace) a broadcast WEP key + * + * @since S60 3.1 + * @param aCtxImpl statemachine context + * @param aKeyIndex Index of the key in the default key table + * @param aKeyLength Length of the key in BYTES + * @param aKey The WEP key + * @param aMac MAC address associated with the key + * @return ETrue if state transition occurred, EFalse otherwise + */ + virtual TBool AddBroadcastWepKey( + WlanContextImpl& aCtxImpl, + TUint32 aKeyIndex, + TBool aUseAsDefaulKey, + TUint32 aKeyLength, + const TUint8 aKey[KMaxWEPKeyLength], + const TMacAddress& aMac ); + + /** + * From MWlanUserEvent + * Reconfigures the specified Tx queue if necessary + * + * @since S60 v3.2 + * @param aCtxImpl statemachine context + * @param aQueueId ID of the queue to reconfigure + * @param aMediumTime The amount of time the queue is allowed to access + * the WLAN air interface. + * @param aMaxTxMSDULifetime Maximum Transmit MSDU Lifetime to be used + * for the specified queue. + * @return ETrue if a state change occurred + * EFalse otherwise + */ + virtual TBool ConfigureTxQueueIfNecessary( + WlanContextImpl& aCtxImpl, + TQueueId aQueueId, + TUint16 aMediumTime, + TUint32 aMaxTxMSDULifetime ); + + /** + * Sets the WHA::KMibDot11GroupAddressesTable MIB + * + * @param aCtxImpl statemachine context + * @return ETrue if a state change occurred in the state machine + * EFalse otherwise + */ + TBool SetGroupAddressesTableMib( + WlanContextImpl& aCtxImpl ); + + /** + * If the power mgmt mode needs to be changed - based on + * aPowerMgmtModeChange - proceeds with the necessary actions + * + * @param aCtxImpl statemachine context + * @param aPowerMgmtModeChange + * @return ETrue if a state change occurred in the state machine + * EFalse otherwise + */ + TBool PowerMgmtModeChange( + WlanContextImpl& aCtxImpl, + TPowerMgmtModeChange aPowerMgmtModeChange ); + +private: + + /** + * Configures Tx rate policy objects, sets the policy object to use for + * every Tx Queue / QoS AC, and also sets the Initial Max Tx Rate to be + * used for the configured policy objects + * + * @since S60 v3.1 + * @param aCtxImpl statemachine context + * @param aRatePolicy rate policy (policy objects) + * @param aQueue2RateClass Tx queue (AC) to rate policy object mapping + * @param aInitialMaxTxRate4RateClass initial max Tx rate for the + * policy objects + * @param aAutoRatePolicy auto rate policy + * @param aHtMcsPolicy HT MCS policy + * @return ETrue if a state change occurred + * EFalse otherwise + */ + virtual TBool ConfigureTxRatePolicies( + WlanContextImpl& aCtxImpl, + const TTxRatePolicy& aRatePolicy, + const TQueue2RateClass& aQueue2RateClass, + const TInitialMaxTxRate4RateClass& aInitialMaxTxRate4RateClass, + const TTxAutoRatePolicy& aAutoRatePolicy, + const THtMcsPolicy& aHtMcsPolicy ); + + /** + * Configures dynamic power mode management traffic override + * + * The settings here become effective once using the PS mode has been + * allowed by WLAN Mgmt Client. + * When a setting below is ETrue, any amount of Rx or Tx traffic via + * the AC in question won't cause a change from PS to CAM mode once PS + * mode has been entered, and traffic via that AC won't make us to + * stay in CAM either. + * Every AC has a separate setting for U-APSD and legacy PS. + * The U-APSD setting is used if U-APSD is used for the AC in question. + * Otherwise the corresponding legacy setting is used. + * + * @since S60 3.2 + * @param aCtxImpl statemachine context + * @param aStayInPsDespiteUapsdVoiceTraffic U-APSD Voice AC setting + * @param aStayInPsDespiteUapsdVideoTraffic U-APSD Video AC setting + * @param aStayInPsDespiteUapsdBestEffortTraffic U-APSD Best Effort AC + * setting + * @param aStayInPsDespiteUapsdBackgroundTraffic U-APSD Background AC + * setting + * @param aStayInPsDespiteLegacyVoiceTraffic legacy Voice AC setting + * @param aStayInPsDespiteLegacyVideoTraffic legacy Video AC setting + * @param aStayInPsDespiteLegacyBestEffortTraffic legacy Best Effort AC + * setting + * @param aStayInPsDespiteLegacyBackgroundTraffic legacy Background AC + * setting + * @return ETrue if a state change occurred + * EFalse otherwise + */ + virtual TBool ConfigurePwrModeMgmtTrafficOverride( + WlanContextImpl& aCtxImpl, + TBool aStayInPsDespiteUapsdVoiceTraffic, + TBool aStayInPsDespiteUapsdVideoTraffic, + TBool aStayInPsDespiteUapsdBestEffortTraffic, + TBool aStayInPsDespiteUapsdBackgroundTraffic, + TBool aStayInPsDespiteLegacyVoiceTraffic, + TBool aStayInPsDespiteLegacyVideoTraffic, + TBool aStayInPsDespiteLegacyBestEffortTraffic, + TBool aStayInPsDespiteLegacyBackgroundTraffic ); + + // Prohibit copy constructor + WlanDot11Associated( const WlanDot11Associated& ); + // Prohibit assigment operator + WlanDot11Associated& operator= ( const WlanDot11Associated& ); + + }; + +#endif // WLANDOT11ASSOCIATED_H