--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/btstack/l2cap/l2signalmgr.h Fri Jan 15 08:13:17 2010 +0200
@@ -0,0 +1,195 @@
+// Copyright (c) 1999-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:
+// Defines the L2CAP Mux
+//
+//
+
+#ifndef L2SIGNALMGR_H
+#define L2SIGNALMGR_H
+
+#include <e32base.h> // CBase
+#include <es_prot.h> // MSocketNotify
+#include <bt_sock.h>
+
+#include "notification.h"
+#include "L2CapPDU.h"
+
+class CL2CAPMuxController;
+class CL2CapSAPSignalHandler;
+class CL2CapLinkSignalHandler;
+
+class CL2CapBasicDataController;
+class MEchoResponseHandler;
+
+class TBTDevAddr;
+
+static const TUint KRemoteDeviceProcessRequestDuration = 1; // Time in seconds
+NONSHARABLE_CLASS(CL2CAPMux) : public CBase,
+ private MSocketNotify,
+ public MPhysicalLinkObserver,
+ public MPduOwner
+ {
+public:
+ static CL2CAPMux* NewL(CL2CAPMuxController& aMuxController, const TBTDevAddr& aAddr);
+ ~CL2CAPMux();
+
+ // Some notifications passed up from the linkmgr
+ void IoctlComplete(TInt aErr, TUint level,TUint name,TDesC8* aBuf);
+ void L2CapEntityConfigUpdated();
+
+ // From MSocketNotify
+ void NewData(TUint aCount);
+ void CanSend();
+ void ConnectComplete();
+ void ConnectComplete(const TDesC8& aConnectData);
+ void ConnectComplete(CServProviderBase& aSSP);
+ void ConnectComplete(CServProviderBase& aSSP,const TDesC8& aConnectData);
+ void CanClose(TDelete aDelete = EDelete);
+ void CanClose(const TDesC8& aDisconnectData, TDelete aDelete = EDelete);
+ void Error(TInt aError,TUint aOperationMask = EErrorAllOperations);
+ void Disconnect();
+ void Disconnect(TDesC8& aDisconnectData);
+
+ void IoctlComplete(TDesC8 *aBuf);
+ void NoBearer(const TDesC8& aConnectionInfo);
+ void Bearer(const TDesC8& aConnectionInfo);
+
+ // MPduOwner
+ virtual void HandlePduSendComplete(HL2CapPDU& aPdu);
+ virtual void HandlePduSendError(HL2CapPDU& aPdu);
+
+ // Signal packet timer interface
+
+ // Getters & Setters
+ const TBTDevAddr& RemoteBTAddr() const;
+ TUint8 NextSigId();
+ CL2CAPMuxController& MuxController() const;
+
+ TInt SetOption(TUint level,TUint name,const TDesC8 &aOption);
+ TInt GetOption(TUint level,TUint name,TDes8& aOption) const;
+
+ void RegisterSAPSignalHandler(CL2CapSAPSignalHandler& aSAPSigHandler);
+ void DetachFromMux(CL2CapSAPSignalHandler& aSAPSigHandler);
+
+ void CompleteACLConnect(CServProviderBase* aSAP);
+
+ void RegisterDataPDUHandler(CL2CapBasicDataController& aPDUDataHandler);
+ void DataChannelRemoved(CL2CapBasicDataController* aDataController);
+ void MuxerPriorityUpdate(TInt aPriority);
+ TInt GetSumMuxerChannelPriorities();
+ void ChannelPriorityUpdated(CL2CapBasicDataController& aDataController);
+
+ void PDUAvailable();
+
+ void ProcessFlushTimerExpiry();
+ TUint16 SigMTU() const;
+
+ void ErrorAllSignalHandlers(TInt aError);
+
+ TInt SendEchoRequest(const TDes8* aData, CL2CapSAPSignalHandler& aEchoResponseHandler);
+ void EchoResponseReceived(const TDesC8* aData, MEchoResponseHandler& aEchoResponseHandler);
+
+ TInt GetFreeCID(TL2CAPPort& aReturnPort);
+ TInt GetACLMTU() const;
+
+ CL2CapSAPSignalHandler* GetSignalHandlerWithRemoteCID(TL2CAPPort aRemoteCID);
+
+ //From MPhysicalLinkObserver
+ void PhysicalLinkChange(const TBTBasebandEventNotification& aEvent, CPhysicalLink& aPhysicalLink);
+ TPhysicalLinkObserverQLink& ObserverQLink() {return iQlink;};
+
+ TUint8 AdjustRTXTimerForSniffMode(TUint8 aBaseRTXTimerDuration) const;
+
+private:
+ CL2CAPMux(CL2CAPMuxController&, const TBTDevAddr& aAddr);
+ void ConstructL();
+
+ void PacketComplete();
+ TBool HardwareFlushAllowed();
+
+ TBool Idle();
+ TInt MuxIdled();
+ void CancelIdle();
+ void StartIdleTimer();
+ static TInt IdleTimerExpired(TAny *aMuxer);
+ static TInt AsyncCallBackForIdleMux(TAny *aMuxer);
+ static TInt AsyncCallBackForTryToSend(TAny *aMuxer);
+ void NewL2CAPData(RMBufChain& aData, TUint8 aFlag);
+
+ void PriorityAddDataController(CL2CapBasicDataController& aDataController);
+ void TryToSend();
+
+public:
+ TDblQueLink iMuxControllerLink;
+
+private:
+ // Link info
+ enum TLinkState
+ {
+ ELinkNone = 0,
+ ELinkPending,
+ EConnected,
+ ELinkInbound,
+ };
+
+
+ CL2CAPMuxController& iMuxController; //< Our Mux Controller
+ TLinkState iLinkState; //< The state of the baseband link
+ TBTDevAddr iRemote; //< The device we're talking to
+
+ TDeltaTimerEntry iIdleTimerEntry; //< Disconnection idle timer
+ TBool iIdleTimerActive; //< Is Idle timer running.
+
+ CAsyncCallBack* iAsyncCallBackForTryToSend;//< Async. stuff: callback SendCallBack to send (medium priority) or, finally, TerminateCallBack to kill (high priority).
+ CAsyncCallBack* iAsyncCallBackForIdleMux;//< For deleting idle muxers without a delay
+
+ // the bound SAP
+ CServProviderBase* iBoundSAP;
+
+ //link level stuff
+ TInt iACLMTU;
+ TInt iACLMRU;
+ TUint8 iSigId;
+
+ TDblQue<CL2CapBasicDataController> iDataHandlers;
+ TDblQue<CL2CapSAPSignalHandler> iSapSignalHandlers;
+ CL2CapLinkSignalHandler* iBoundLinkSignalHandler;
+
+ TDblQue<HL2CapPDU> iPDUsWaitingResendQ;
+ TDblQue<HL2CapPDU> iPDUsWaitingSend;
+
+ HFragmentedPDUSender* iFragmentSender;
+ RMBufChain iIncomingPDU;
+
+ TInt iTryToSendPriority;
+ TBool iUpdateTryToSendPriority;
+
+ TL2CAPPort iNextCID;
+ TUint16 iNumberOfDataChannels;
+ TBasebandTime iSniffInterval;
+
+ TPhysicalLinkObserverQLink iQlink;
+ };
+
+inline const TBTDevAddr& CL2CAPMux::RemoteBTAddr() const
+ {
+ return iRemote;
+ }
+
+inline CL2CAPMuxController& CL2CAPMux::MuxController() const
+ {
+ return iMuxController;
+ }
+
+#endif