linklayerprotocols/pppnif/INC/PPPLCP.H
changeset 0 af10295192d8
--- /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 <e32base.h>
+#include <e32std.h>
+#include <comms-infras/ss_subconnflow.h>
+#include <comms-infras/nifif.h>
+#include <comms-infras/ss_protflow.h>
+#include <comms-infras/ss_flowbinders.h>
+#include <networking/pppdef.h>
+#include <networking/pppconfig.h>		// for CCPppLcpConfig::TPppLinkMode
+#include <comms-infras/agentmessages.h>	// for CAgentProvisionInfo
+#include <comms-infras/commsdebugutility.h>
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <nifvar_internal.h>
+#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<MPppRecvr> 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 <networking/ppplcp.inl>
+#endif