diff -r 000000000000 -r af10295192d8 linklayerprotocols/pppnif/INC/PPPLCP.H --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/linklayerprotocols/pppnif/INC/PPPLCP.H Tue Jan 26 15:23:49 2010 +0200 @@ -0,0 +1,435 @@ +/** +* 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 "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: +* Header file for the Default SubConnection Flow +* +* +*/ + + + +/** + @file PPPLCP.h + @internalComponent +*/ + +#ifndef PPPLCP_H_INCLUDED_ +#define PPPLCP_H_INCLUDED_ + +#include +#include +#include +#include +#include +#include +#include +#include // for CCPppLcpConfig::TPppLinkMode +#include // for CAgentProvisionInfo +#include +#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS +#include +#endif + + +//////////////////////////////////////////////////////////////////////////////// +// PPP LCP - The heart of PPP +//////////////////////////////////////////////////////////////////////////////// + +//const TUint KPppIdEsocl = 0x10000; // outside PPP range and Esock forbids zero. + +class CPppAcp; +class CPppAuthentication; +class CPppMsCbcpClient; // CSW + +// Callback IETF request types (see draft RFC for PPP-callback) +typedef enum // CSW + { + ECallbackIETFRequestType0=0, // defined by IETF draft RFC + ECallbackIETFRequestType1=1, + ECallbackIETFRequestType2=2, + ECallbackIETFRequestType3=3, + ECallbackIETFRequestType4=4, + ECallbackIETFRequestType5=5, + // and also + ECallbackIETFRequestTypeMSCBCP=6 // from MS rejected draft + } TCallbackIETFRequestType; + +// String literals for protocol name used during flow binding +_LIT8(KProtocol4, "ip"); +_LIT8(KDescIcmp, "icmp"); +_LIT8(KProtocol6, "ip6"); + +class CPppCcp; +class CPppLrd; +class CPppFlowBase; +class MPppRecvr; +class CPppCompressor; +class CPppDeCompressor; +class RPppOptionList; +#if defined (__FLOG_ACTIVE) +class CPppLog; +#endif + +class CPppBinderIp4; +class CPppBinderIp6; +class CPppLinkBase; +class TSigLinkSubType; +class CIPConfig; +class CPppLcpConfig; +class CHDLCConfig; +class CCredentialsConfig; +class CPPPAuthConfig; +class CPppConfig; +class CAgentProvisionInfo; +class CPppProvisionInfo; + +class CPppLcp : public ESock::CSubConnectionFlowBase, public ESock::MFlowBinderControl, + public ESock::MUpperDataReceiver, public ESock::MUpperControl, + public MPppFsm, public MPppOptionsExtender +/** +PPP Link Control Protocol class. +This class oversees all the other PPP protocol classes, in addition to +implementing the LCP state machine. Objects are instantiated at initialization +or as necessary to implement the protocols: + CCP, authentication, CBCP, IPCP, IPV6CP +@internalComponent +*/ + { + friend class CPppLcpFactory; +public: + enum TPppProtocol { EPppProtocolBegin = 1, EPppProtoNone = EPppProtocolBegin, EPppIp4 , EPppIp6, EPppAuth, EPppProtocolEnd }; + + IMPORT_C static CPppLcp* NewL(ESock::CSubConnectionFlowFactoryBase& aFactory, const Messages::TNodeId& aSubConnId, ESock::CProtocolIntfBase* aProtocolIntf); + + //-========================================================= + // Methods for handling SCPR messages + //-========================================================= + IMPORT_C virtual void SubConnectionGoingDown(); + IMPORT_C virtual void SubConnectionError(TInt aError); + IMPORT_C virtual void StartFlowL(); + IMPORT_C virtual void StopFlow(TInt aError); + + IMPORT_C virtual void ProvisionConfig(const ESock::RMetaExtensionContainerC& aConfigData); + IMPORT_C virtual void Destroy(); + IMPORT_C virtual void AuthenticateResponseMessage(); + IMPORT_C virtual void AgentToFlowNotification(TInt aNotificationId); + + //-========================================================= + // MFlowBinderControl methods + //-========================================================= + IMPORT_C virtual ESock::MLowerControl* GetControlL(const TDesC8& aProtocol); + IMPORT_C virtual ESock::MLowerDataSender* BindL(const TDesC8& aProtocol, ESock::MUpperDataReceiver* aReceiver, ESock::MUpperControl* aControl); + IMPORT_C virtual void Unbind(ESock::MUpperDataReceiver* aReceiver, ESock::MUpperControl* aControl); + IMPORT_C virtual ESock::CSubConnectionFlowBase* Flow(); //returns its own flow + +protected: + IMPORT_C CPppLcp(ESock::CSubConnectionFlowFactoryBase& aFactory, const Messages::TNodeId& aSubConnId, ESock::CProtocolIntfBase* aProtocolIntf); + IMPORT_C virtual ~CPppLcp(); + + //-========================================================= + // FSM upcalls + //-========================================================= + IMPORT_C virtual TInt FsmLayerStarted(); + IMPORT_C virtual void FsmLayerFinished(TInt aReason=KErrNone); + IMPORT_C virtual void FsmLayerUp(); + IMPORT_C virtual void FsmLayerDown(TInt aReason=KErrNone); + IMPORT_C virtual void FsmFillinConfigRequestL(RPppOptionList& aRequestList); + IMPORT_C virtual void FsmCheckConfigRequest(RPppOptionList& aRequestList, RPppOptionList& aAckList, RPppOptionList& aNakList, RPppOptionList& aRejList); + IMPORT_C virtual void FsmApplyConfigRequest(RPppOptionList& aRequestList); + IMPORT_C virtual void FsmRecvConfigAck(RPppOptionList& aReplyList); + IMPORT_C virtual void FsmRecvConfigNak(RPppOptionList& aReplyList, RPppOptionList& aReqList); + IMPORT_C virtual void FsmRecvConfigReject(RPppOptionList& aReplyList, RPppOptionList& aReqList); + IMPORT_C virtual void FsmTerminationPhaseComplete(); + IMPORT_C virtual TBool FsmRecvUnknownCode(TUint8 aCode, TUint8 aId, TInt aLength, RMBufChain& aPacket); + IMPORT_C virtual TBool FsmConfigRequestOptionsValid(RPppOptionList& aList); + IMPORT_C virtual TBool FsmAckOptionsValid(RPppOptionList& aList, RPppOptionList& aRequestList); + IMPORT_C virtual TBool FsmRejectOptionsValid(RPppOptionList& aList, RPppOptionList& aRequestList); + + //-========================================================= + // Messages::ANode methods + //-========================================================= + IMPORT_C void ReceivedL(const Messages::TRuntimeCtxId& aSender, const Messages::TNodeId& aRecipient, Messages::TSignatureBase& aMessage); + + //-========================================================= + // CSubConnectionFlowBase methods + //-========================================================= + IMPORT_C virtual ESock::MFlowBinderControl* DoGetBinderControlL(); + +public: + + //-========================================================= + // MUpperDataReceiver methods + //-========================================================= + IMPORT_C virtual void Process(RMBufChain& aData); + + //-========================================================= + // MUpperControl methods + //-========================================================= + IMPORT_C virtual void StartSending(); + IMPORT_C virtual void Error(TInt aError); + + //-========================================================= + // Custom methods + //-========================================================= + // provide compatability for classes using old CNifIfLink style API and PPP Internal Stop() calls + void Stop(TInt aReason, MNifIfNotify::TAction aAction); + // call from Binder - MLowerDataSender + ESock::MLowerDataSender::TSendResult Send(RMBufChain& aPdu, TUint aProtocol); + + // + // Calls from Binder + // + + IMPORT_C virtual void BinderLinkUp(TPppProtocol aProtocol); // overriden by CFProtocols derived from CPppLcp + + void Progress(TInt aStage, TInt aError); + void FlowUp(); + void FlowDown(TInt aError, MNifIfNotify::TAction aAction); + + // Utility methods for retrieving different provisioning information structures + inline const CIPConfig* GetNcpConfig() const; + inline const CPppLcpConfig* GetLcpConfig() const; + inline const CBCAProvision* GetBCAProvision() const; + inline const CPppAuthConfig* GetAuthConfig() const; + inline const CAgentProvisionInfo* GetAgentConfig() const; + inline const CPppProvisionInfo* GetPppAgentConfig() const; + + inline const TDesC8& GetExcessData() const; + + // Retrieve pointer to locally held credentials object + inline const CCredentialsConfig* GetCredentials() const; + + //-========================================================= + // For CPPPAuthenticate methods - might be worth moving them elsewhere. + //-========================================================= + void Authenticate(CPppAuthentication* aAp); + void CancelAuthenticate(CPppAuthentication* aAp); + +private: + CPppAuthentication* iAuthenticate; + +protected: + void InitL(); + + //-========================================================= + // Custom methods + //-========================================================= + TInt DoStartFlow(); + void DoStopFlow(TInt aReason, MNifIfNotify::TAction aAction); + void ProvisionConfigL(const ESock::RMetaExtensionContainerC& aConfigData); + +private: + CPppBinderIp4 *iBinder4; + CPppBinderIp6* iBinder6; + + //-========================================================= + // PPP Configs cached + //-========================================================= + + // + // Pointers to provisioning information objects retrieved from CAccessPointConfig + // + const CBCAProvision* iBCAProvision; + const CIPConfig* iPppNcpConfig; + const CPppLcpConfig* iPppLcpConfig; + const CPppAuthConfig* iPppAuthConfig; + const CAgentProvisionInfo* iAgentProvision; + const CPppProvisionInfo* iPppAgentProvision; + const CCredentialsConfig* iCredentials; + + TBool iInitialised; + TInt iSavedError; // saved error (if any) from processing ProvisionConfig message + +public: + //-========================================================= + // PPP Legacy methods + //-========================================================= + inline CPppLinkBase* PppLink() { return iPppLink; } + void RegisterRecvr(MPppRecvr* aRecvr); + void ReregisterRecvr(MPppRecvr* aRecvr); + void DeregisterRecvr(MPppRecvr* aRecvr); + void LinkFlowOn(); + void LinkLayerUp(); + void LinkLayerDown(TInt aStatus); + void PhaseComplete(); + void PhaseAborted(TInt aStatus); + void PhaseAdvance(TPppPhase aNewPhase); + void PhaseRetard(TPppPhase aNewPhase, TInt aReason); + TUint8 SendEchoRequest(); + void SendIdentification(); + inline CPppLcpConfig::TPppLinkMode PppLinkMode() const; + void NcpUp(); + // + TInt PppOpen(); + void PppClose(TInt aReason); + + inline TBool DoLcpExts() const { return iDoLcpExts; } + inline void CallbackRequestGranted(); // CSW + void TerminateLink(MNifIfNotify::TAction aAction=MNifIfNotify::EDisconnect, TInt aError=KErrNone); + void PppNewCompressor(const CPppCompressor* aCompressor); + void PppUnloadCompressor(); + void PppNewDeCompressor(const CPppDeCompressor* aDeCompressor); + void StopProtocol(TUint aProtocol); + TBool DoesDllExist(const TDesC& aFilename); + inline CObjectConIx* ContainerForDlls() const { return iContainerForDlls; } + + TInt Notification(TAgentToNifEventType aEvent, void * aInfo); + + // Added for callback July 99 + inline TCallbackIETFRequestType CallbackRequestType(){return iCallbackIETFRequestType;} + inline TBool CallbackEnabled(){return iCallbackEnabled;} + + inline void SetMaxTransferSize(TInt aLength); + inline TInt MaxTransferSize() const; + inline void SetMaxReceiveSize(TInt aSize); + inline TInt MaxReceiveSize() const; + + void CancelRead(); + + void CallbackGrantedAndAuthenticated(); + + // Returns true if an external IP configuration agent (MIP, DHCP) is active + TBool QueryExternalIPConfiguration(); + + void LinkRecv(RMBufChain& aPacket); + +private: + static void NewMagicNumberL(TUint& aMagicNumber); + INLINE void AppendCallbackRequestL(RPppOptionList& aRequestList ); + INLINE void InitCallbackInfoL(); + INLINE void PhaseAdvancesBeyondAuthenticate(); + INLINE void GetCallbackInfoL(); + INLINE void NewCallbackRequestInfoL( TCallbackIETFRequestType aRequestType ); // CSW + + // Utility functions for posting messages to SCPR + + void PostProgressMessage(TInt aStage, TInt aError); + void PostDataClientStartedMessage(); + void PostFlowDownMessage(TInt aError); + void PostErrorMessage(TInt aError); + void MaybePostDataClientIdle(); + TBool AllNcpsUp(); + // Utility functions for processing incoming SCPR messages + TInt NotificationMessage(TAgentToNifEventType aNotificationId); + + // Utilities for retrieval of SCPr Provisioning Information + TInt RetrieveDynamicProvisionInfo(); + + // Flogging mechanism + __FLOG_DECLARATION_MEMBER; +private: + + /** IP Protocol */ + + /** The Compression Control Protocol object */ + CPppCcp* iPppCcp; + + /** Number of times PppOpen has been called without a corresponding PppClose */ + TInt iOpenCount; + + /** Current PPP phase */ + TPppPhase iPhase; + + /** Authentication protocol framework object */ + CPppAcp* iPppAcp; + + /** Link quality checking object */ + CPppLrd* iPppLrd; + + /** Lower link-layer object */ + CPppLinkBase* iPppLink; + + /** List of objects that can receive incoming packets */ + TDblQue iRecvrList; + + TUint iLocMagicNumber; + TUint iRemMagicNumber; // Or last NAK sent to peer + TInt iConsecMagic; + TInt iMaxSendSize; + TInt iMaxRecvSize; + HBufC8* iRecvIdentification; + TTimeIntervalSeconds iRecvTimeRemaining; + TTime iRecvTimeNotification; + HBufC8* iRecvTimeRemMessage; + /** Authentication protocol object */ + + + /** Whether CBCP configuration has been read */ + TBool iGotCallbackInfo; + + /** Whether CBCP is enabled */ + TBool iCallbackEnabled; + + TCallbackAction iCallbackAction; + TCallbackIETFRequestType iCallbackIETFRequestType; + TUint8* iCallbackInfo; + TInt iCallbackInfoLen; + TUint8* iCallbackIETFRequestPacket; + TInt iCallbackIETFRequestPacketLen; + TBool iCallbackRequestGranted; + + /* Callback Control Protocol object */ + CPppMsCbcpClient* iPppMsCbcp; + + /** The action to take once the link goes down */ + MNifIfNotify::TAction iTerminateAction; + + /** The reason the link is going down */ + TInt iError; + + /** Whether certain extended PPP options from RFC 1570 are to be handled */ + TBool iDoLcpExts; + + TBool iRecursive; + CObjectConIx* iContainerForDlls; + + /** Whether authentication has been completed */ + TBool iAuthenticateDone; + + /** The last request received */ + Messages::TNodeSignal::TMessageId iLastRequest; + TBool iLastRequestErrored; + + /** Whether we are configured to do Mobile IP */ + TBool iDoExternalIPConfiguration; + + /** Whether we are configured for client or server mode */ + CPppLcpConfig::TPppLinkMode iLinkMode; + + /*The number of Ncps that have reported being up*/ + TInt iNcpUpCount; + + enum TMeshMachineFlowState + { + EStopped, + EStarting, + EStarted, + EStopping, + }; + TMeshMachineFlowState iMMState; + Elements::TStateChange iLastStateChange; //To avoid double reporting + TBool iSentIdle; + +#ifdef __FLOG_ACTIVE +public: + CPppLog* iLogger; + TInt iLogLevel; + +private: + const TText8* GetMMStateName() const; +#endif + }; + +#include +#endif