diff -r 000000000000 -r 29b1cd4cb562 bluetooth/btstack/l2cap/l2capSigPacketConfigure.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bluetooth/btstack/l2cap/l2capSigPacketConfigure.h Fri Jan 15 08:13:17 2010 +0200 @@ -0,0 +1,268 @@ +// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "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: +// + +#ifndef L2CAPSIGPACKETCONFIGURE_H +#define L2CAPSIGPACKETCONFIGURE_H + +#include "l2capCommand.h" + +class CL2CapChannelConfig; +class TL2CapConfigParamOptions; + +NONSHARABLE_CLASS(HConfigureRequest) : public HL2CapCommand + { +public: + static HConfigureRequest* New(TL2CAPPort aRemotePort, CL2CapChannelConfig& aConfig, + TUint8 aRTXTimerDuration = KDefaultRTXTimerDuration, + TUint16 aERTXTimerDuration = KDefaultERTXTimerDuration); + static TInt NewCommandIfValid(RMBufChain& aBuffer, HL2CapCommand*& aCommand); + + TBool ProcessCommand(CL2CapSignalHandler& aSignalHandler); + + inline TL2CAPPort DestinationCID() const; + inline TConfigFlags Flags() const; + inline void SetDestinationCID(TL2CAPPort aPort); + inline void SetFlags(TConfigFlags aFlags); + + TInt ParseOptions(TL2CapConfigParamOptions& aConfigOptions, RMBufChain& aUnknownOptions) const; + TInt AddOptionsToCommand(CL2CapChannelConfig& aConfig); + +private: + HConfigureRequest(RMBufChain& aCommand, + TUint8 aRTXTimerDuration = KDefaultRTXTimerDuration, + TUint16 aERTXTimerDuration = KDefaultERTXTimerDuration); + +private: + const static TUint8 KConfigRequestEmptyLength = 8; + + const static TUint8 KDestinationCIDOffset = 4; + const static TUint8 KFlagsOffset = 6; + const static TUint8 KOptionsOffset = 8; + + const static TUint8 KNoConfigurationFlags = 0; + }; + +inline TL2CAPPort HConfigureRequest::DestinationCID() const + { + return GetLittleEndian16(KDestinationCIDOffset, iCommand); + } + +inline TConfigFlags HConfigureRequest::Flags() const + { + return GetLittleEndian16(KFlagsOffset, iCommand); + } + +inline void HConfigureRequest::SetDestinationCID(TL2CAPPort aPort) + { + PutLittleEndian16(aPort, KDestinationCIDOffset, iCommand); + } + +inline void HConfigureRequest::SetFlags(TConfigFlags aFlags) + { + PutLittleEndian16(aFlags, KFlagsOffset, iCommand); + } + + +NONSHARABLE_CLASS(HConfigureResponse) :public HL2CapCommand + { +public: + static HConfigureResponse* New(TUint8 aId, TL2CAPPort aRemotePort, TConfigFlags aFlags, TConfigResponseResult aResult); + static TInt NewCommandIfValid(RMBufChain& aBuffer, HL2CapCommand*& aCommand); + + TBool ProcessCommand(CL2CapSignalHandler& aSignalHandler); + + inline TL2CAPPort SourceCID() const; + inline TConfigFlags Flags() const; + inline TConfigResponseResult Results() const; + inline void SetSourceCID(TL2CAPPort aPort); + inline void SetFlags(TConfigFlags aFlags); + inline void SetResults(TConfigResponseResult aResult); + + TInt ParseOptions(TL2CapConfigParamOptions& aConfigOptions, RMBufChain& aUnknownOptions) const; + TInt AddOptionsToCommand(CL2CapChannelConfig& aConfig, TConfigResponseResult aResult); + void AddUnknownOptionsToCommand(RMBufChain& aUnknownOptions); + +public: + // Used on creation to specify that no flags + // (i.e., the continuation flag) are set. + const static TUint8 KNoConfigurationFlags = 0; + +private: + HConfigureResponse(RMBufChain& aCommand); + +private: + const static TUint8 KConfigResponseEmptyLength = 10; + + const static TUint8 KSourceCIDOffset = 4; + const static TUint8 KFlagsOffset = 6; + const static TUint8 KResultOffset = 8; + const static TUint8 KOptionsOffset = 10; + }; + +inline TL2CAPPort HConfigureResponse::SourceCID() const + { + return GetLittleEndian16(KSourceCIDOffset, iCommand); + } + +inline TConfigFlags HConfigureResponse::Flags() const + { + return GetLittleEndian16(KFlagsOffset, iCommand); + } + +inline TConfigResponseResult HConfigureResponse::Results() const + { + return static_cast(GetLittleEndian16(KResultOffset, iCommand)); + } + +inline void HConfigureResponse::SetSourceCID(TL2CAPPort aPort) + { + PutLittleEndian16(aPort, KSourceCIDOffset, iCommand); + } + +inline void HConfigureResponse::SetFlags(TConfigFlags aFlags) + { + PutLittleEndian16(aFlags, KFlagsOffset, iCommand); + } + +inline void HConfigureResponse::SetResults(TConfigResponseResult aResult) + { + PutLittleEndian16(static_cast(aResult), KResultOffset, iCommand); + } + +NONSHARABLE_CLASS(TL2CapConfigParamOptions) + { +public: + TL2CapConfigParamOptions(); + + inline void SetMtu(const TMTUOption& aMtu); + inline TBool IsMtuSet() const; + inline const TMTUOption& Mtu() const; + + inline void SetFlushTimeout(const TFlushTimeoutDurationOption& aFlushTimeout); + inline TBool IsFlushTimeoutSet() const; + inline const TFlushTimeoutDurationOption& FlushTimeout() const; + + inline void SetFec(const TRetransmissionAndFlowControlOption& aFec); + inline TBool IsFecSet() const; + inline const TRetransmissionAndFlowControlOption& Fec() const; + + inline void SetQos(const TQualityOfServiceOption& aQos); + inline TBool IsQosSet() const; + inline const TQualityOfServiceOption& Qos() const; + + TBool operator==(const TL2CapConfigParamOptions& aThat); + + TInt ParseOptions(TUint8 aOptionOffset, const RMBufChain& aCommand, RMBufChain& aUnknownOptions); + + static TInt AddConfigRequestOptions(CL2CapChannelConfig& aConfig, TUint8 aOptionOffset, RMBufChain& aOptions); + static TInt AddConfigResponseOptions(CL2CapChannelConfig& aConfig, TUint8 aOptionOffset, RMBufChain& aOptions, TConfigResponseResult aResult); + static TInt AddMtuOptionL(TInt16 aMtu, TUint8 aOptionOffset, RMBufChain& aOptions); + static TInt AddFlushOptionL(TInt16 aFlushTimeout, TUint8 aOptionOffset, RMBufChain& aOptions); + static TInt AddQosOptionL(const TQualityOfServiceOption& aQosOption, TUint8 aOptionOffset, RMBufChain& aOptions); + static TInt AddFecOptionL(const TRetransmissionAndFlowControlOption& aFecOption, TUint8 aOptionOffset, RMBufChain& aOptions); + static TBool VerifyOptionsStructure(TUint8 aOptionOffset, const RMBufChain& aCommand); +private: + // Options Constants + const static TUint8 KTypeOffset = 0; + const static TUint8 KLengthOffset = 1; + const static TUint8 KDataOffset = 2; + const static TUint8 KOptionHeaderLength = 2; + + const static TUint8 KMTUOptionDataLen = 2; + const static TUint8 KFlushOptionDataLen = 2; + const static TUint8 KQOSOptionDataLen = 22; + const static TUint8 KFECOptionDataLen = 9; + const static TUint8 KFcsOptionDataLen = 1; + + //QOS Options Offsets + const static TUint8 KQOSServiceTypeOffset = 1; + const static TUint8 KTokenRateOffset = 2; + const static TUint8 KTokenBucketSizeOffset = 6; + const static TUint8 KPeakBandwidthOffset = 10; + const static TUint8 KLatencyOffset = 14; + const static TUint8 KDelayVariationOffset = 18; + + // FEC Options Offsets + const static TUint8 KLinkModeOffset = 0; + const static TUint8 KTxWindowSizeOffset = 1; + const static TUint8 KMaxTransmitOffset = 2; + const static TUint8 KRetransmissionTimeoutOffset = 3; + const static TUint8 KMonitorTimeoutOffset = 5; + const static TUint8 KMaximumPDUSizeOffset = 7; + +private: + TBool iMtuSet; + TMTUOption iMtu; + + TBool iFlushTimeoutSet; + TFlushTimeoutDurationOption iFlushTimeout; + + TBool iFecSet; + TRetransmissionAndFlowControlOption iFec; + + TBool iQosSet; + TQualityOfServiceOption iQos; + }; + + +inline void TL2CapConfigParamOptions::SetMtu(const TMTUOption& aMtu) + { + iMtu = aMtu; + iMtuSet = ETrue; + } + +inline TBool TL2CapConfigParamOptions::IsMtuSet() const + { return iMtuSet; } + +inline const TMTUOption& TL2CapConfigParamOptions::Mtu() const + { return iMtu; } + +inline void TL2CapConfigParamOptions::SetFlushTimeout(const TFlushTimeoutDurationOption& aFlushTimeout) + { + iFlushTimeout = aFlushTimeout; + iFlushTimeoutSet = ETrue; + } + +inline TBool TL2CapConfigParamOptions::IsFlushTimeoutSet() const + { return iFlushTimeoutSet; } + +inline const TFlushTimeoutDurationOption& TL2CapConfigParamOptions::FlushTimeout() const + { return iFlushTimeout; } + +inline void TL2CapConfigParamOptions::SetFec(const TRetransmissionAndFlowControlOption& aFec) + { + iFec = aFec; + iFecSet = ETrue; + } + +inline TBool TL2CapConfigParamOptions::IsFecSet() const + { return iFecSet; } + +inline const TRetransmissionAndFlowControlOption& TL2CapConfigParamOptions::Fec() const + { return iFec; } + +inline void TL2CapConfigParamOptions::SetQos(const TQualityOfServiceOption& aQos) + { + iQos = aQos; + iQosSet = ETrue; + } + +inline TBool TL2CapConfigParamOptions::IsQosSet() const + { return iQosSet; } + +inline const TQualityOfServiceOption& TL2CapConfigParamOptions::Qos() const + { return iQos; } + +#endif