diff -r 000000000000 -r dfb7c4ff071f commsfwutils/commsbufs/reference/loopback_bearer/inc/binder.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/commsfwutils/commsbufs/reference/loopback_bearer/inc/binder.h Thu Dec 17 09:22:25 2009 +0200 @@ -0,0 +1,271 @@ +/* +* Copyright (c) 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 __LEGACY_LOOPBACK_BINDER_H__ +#define __LEGACY_LOOPBACK_BINDER_H__ + +#include +#include +#include + +#include +#include + +#include "flow.h" + +#ifdef SYMBIAN_OLD_EXPORT_LOCATION +#include +#include +#include "es_protbinder.h" +#else +//this header is not exported, needs to be a user include +#include "legacy_loopback_driver.h" +#include +#include +#endif + +#include + + +class CLegacyLoopbackErrorOneShot : public CAsyncOneShot +/** +Class used to asynchronously signal a binder error +*/ + { + friend class CDummyNifBinder4; // for iUpperControl +public: + CLegacyLoopbackErrorOneShot(); + void RunL(); + void Schedule(ESock::MUpperControl* iUpperControl); + +private: + ESock::MUpperControl* iUpperControl; + }; + +class CLegacyLoopbackSubConnectionFlow; +class CLegacyLoopbackFlowTestingSubscriber; + +class CLegacyLoopbackBinder4 : public CBase, public ESock::MLowerDataSender, public ESock::MLowerControl +/** +IP4 binder +*/ + { +public: + enum { KLoopbackBearerMTU = 1532 }; + + static CLegacyLoopbackBinder4* NewL(CLegacyLoopbackSubConnectionFlow& aLegacyLoopbackSubConnectionFlow); + virtual ~CLegacyLoopbackBinder4(); + + MLowerDataSender* Bind(ESock::MUpperDataReceiver& aUpperReceiver , ESock::MUpperControl& aUpperControl); + void Unbind (ESock::MUpperDataReceiver& aUpperReceiver, ESock::MUpperControl& aUpperControl); + + void BinderReady(); + void ProcessPacket(RMBufChain& aData); + + // from MLowerDataSender + virtual ESock::MLowerDataSender::TSendResult Send(RMBufChain& aData); + + // from MLowerControl + virtual TInt GetName(TDes& aName); + virtual TInt BlockFlow(ESock::MLowerControl::TBlockOption aOption); + virtual TInt GetConfig(TBinderConfig& aConfig); + virtual TInt Control(TUint aLevel, TUint aName, TDes8& aOption); + + // Utility functions + TBool MatchesUpperControl(ESock::MUpperControl* aUpperControl) const; + +protected: + CLegacyLoopbackBinder4(CLegacyLoopbackSubConnectionFlow& aLegacyLoopbackSubConnectionFlow); + +private: + void UpdateHeaders(TInet6HeaderIP4* aIp4, TInet6HeaderUDP* aUdp); + inline CLegacyLoopbackSubConnectionFlow* Flow(); + void LogPacketDetails(TInet6HeaderIP4* aIp4, const TDesC8& aCaption); + +private: + TUint32 iLocalAddressBase; + TUint32 iLocalAddress; + CLegacyLoopbackSubConnectionFlow& iLegacyLoopbackSubConnectionFlow; + ESock::MUpperDataReceiver* iUpperReceiver; + ESock::MUpperControl* iUpperControl; + CLegacyLoopbackErrorOneShot iErrorOneShot; + + // Loopback driver + TBool iLoopbackLoadAttempted; // we only try once + RLegacyLoopbackDriver iDrv; + RMBufAllocator iAllocator; + + class CDrvSender : public CActive + { + public: + CDrvSender(TInt aPriority); + ~CDrvSender(); + void Start(CLegacyLoopbackBinder4* aBinder, RLegacyLoopbackDriver aDrv); + void QueueForSend(RMBufPacket& aPkt); + private: + void RunL(); + void DoCancel(); + void SendPacket(); + + CLegacyLoopbackBinder4* iBinder; + RMBufPktQ iSendQueue; + RLegacyLoopbackDriver iDrv; + RMBufPacket iSendPkt; + + TInt iManyBufCount; + TInt iOneBufCount; + + __FLOG_DECLARATION_MEMBER; + }; + CDrvSender* iDrvSender; + + class CDrvReceiver : public CActive + { + public: + CDrvReceiver(TInt aPriority); + ~CDrvReceiver(); + void Start(CLegacyLoopbackBinder4* aBinder, RLegacyLoopbackDriver aDrv); + private: + void RunL(); + void DoCancel(); + + void RequestReceipt(); + + CLegacyLoopbackBinder4* iBinder; + RLegacyLoopbackDriver iDrv; + TBuf8 iDesBuf; + RMBufPacket iPkt; + RCommsBufPond iPond; + TPtr8 iRxPtr; + }; + CDrvReceiver* iDrvReceiver; + +public: + CLegacyLoopbackFlowTestingSubscriber* iTestSubscriber; + +protected: + __FLOG_DECLARATION_MEMBER; + }; + +class CLegacyLoopbackBinder6 : public CBase, public ESock::MLowerDataSender, public ESock::MLowerControl +/** +IP6 binder +*/ + { +public: + enum { KLoopbackBearerMTU = 1532 }; + + static CLegacyLoopbackBinder6* NewL(CLegacyLoopbackSubConnectionFlow& aLegacyLoopbackSubConnectionFlow); + virtual ~CLegacyLoopbackBinder6(); + + MLowerDataSender* Bind(ESock::MUpperDataReceiver& aUpperReceiver , ESock::MUpperControl& aUpperControl); + void Unbind (ESock::MUpperDataReceiver& aUpperReceiver, ESock::MUpperControl& aUpperControl); + + void BinderReady(); + void ProcessPacket(RMBufChain& aData); + + // from MLowerDataSender + virtual ESock::MLowerDataSender::TSendResult Send(RMBufChain& aData); + + // from MLowerControl + virtual TInt GetName(TDes& aName); + virtual TInt BlockFlow(MLowerControl::TBlockOption /*aOption*/); + virtual TInt GetConfig(TBinderConfig& aConfig); + virtual TInt Control(TUint aLevel, TUint aName, TDes8& aOption); + + // Utility functions + TBool MatchesUpperControl(ESock::MUpperControl* aUpperControl) const; + +protected: + CLegacyLoopbackBinder6(CLegacyLoopbackSubConnectionFlow& aLegacyLoopbackSubConnectionFlow); + +private: + void UpdateHeaders(TInet6HeaderIP* aIp6, TInet6HeaderUDP* /*aUdp*/); + void StaticDnsConfiguration(TBinderConfig6& aConfig); + inline CLegacyLoopbackSubConnectionFlow* Flow(); + +private: + CLegacyLoopbackSubConnectionFlow& iLegacyLoopbackSubConnectionFlow; + ESock::MUpperDataReceiver* iUpperReceiver; + ESock::MUpperControl* iUpperControl; + +protected: + __FLOG_DECLARATION_MEMBER; + + }; + +// +// Inlines +// + +CLegacyLoopbackSubConnectionFlow* CLegacyLoopbackBinder4::Flow() + { + return &iLegacyLoopbackSubConnectionFlow; + } + +CLegacyLoopbackSubConnectionFlow* CLegacyLoopbackBinder6::Flow() + { + return &iLegacyLoopbackSubConnectionFlow; + } + +// various things that will get set up on each interface by dummy nifs +// will be added to the address base to make the broadcast address... +const TUint KBroadcastAddressSuffix = 255; +// some arbitrary num to add to the base to give the default gateway machine... +const TUint KDefaultGatewayAddressSuffix = 10; +// some arbitrary num to add to the base to give the secondary dns server... +const TUint KSecondaryDnsAddressSuffix = 11; +// obviously all the above addresses are totally arbitrary to a certain extent... :-) + + +const TUid KLegacyLoopbackTestingPubSubUid = {0x102871C7}; + +NONSHARABLE_CLASS(CLegacyLoopbackFlowTestingSubscriber) : public CActive + { +public: + TBool IsEnabled() + { + return iIsEnabled; + } + + static TBool ShouldRun(TUint aApId); + + static CLegacyLoopbackFlowTestingSubscriber* NewL(CLegacyLoopbackSubConnectionFlow& aFlow, TUint aApId) + { + CLegacyLoopbackFlowTestingSubscriber* ats = new(ELeave)CLegacyLoopbackFlowTestingSubscriber(aFlow, aApId); + CleanupStack::PushL(ats); + ats->ConstructL(); + CleanupStack::Pop(ats); + return ats; + } + + virtual ~CLegacyLoopbackFlowTestingSubscriber(); + +public: + CLegacyLoopbackFlowTestingSubscriber(CLegacyLoopbackSubConnectionFlow& aFlow, TUint aApId); + void ConstructL(); + + void RunL(); + void DoCancel(); + +private: + CLegacyLoopbackSubConnectionFlow& iFlow; + TInt iApId; + RProperty iProperty; + TBool iIsEnabled : 1; + }; + +#endif // __LEGACY_LOOPBACK_BINDER_H__