linklayerprotocols/pppnif/INC/PPPBASE.H
changeset 0 af10295192d8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/linklayerprotocols/pppnif/INC/PPPBASE.H	Tue Jan 26 15:23:49 2010 +0200
@@ -0,0 +1,339 @@
+// Copyright (c) 1997-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:
+//
+
+/**
+ @file
+ @internalComponent 
+*/
+
+#if !defined(__PPPBASE_H__)
+#define __PPPBASE_H__
+
+#include <nifvar.h>
+#include <nifmbuf.h>
+#include <nifutl.h>
+
+#include <networking/pppdef.h>
+#include <networking/pppsock.h>
+#include <networking/pppcomp.h>
+#include <nifvar_internal.h>
+
+#include <etelpckt.h>
+
+// This initialization file is used when PPP is configured as a client (IfServerMode=FALSE)
+_LIT(PPP_INI_FILE,"ppp.ini");
+
+// This initialization file is used when PPP is configured as a server (IfServerMode=TRUE)
+_LIT(PPP_SERVER_INI_FILE,"pppd.ini");
+
+enum TPppPanic
+	{
+	EPppPanic_PPPHDLCIsAlreadyActive,
+	EPppPanic_PPPDBReadCallback,
+	EPppPanic_PPPNoMemory,
+	EPppPanic_PPPNotSupported,
+	EPppPanic_PacketHeaderTooBig,
+    EPppPanic_PPPInvalidCallback,
+    EPppPanic_PPPNoCallbackInfo,
+    EPppPanic_PPPLcpRequired,
+    EPppPanic_PPPNoNifIfNotify,
+    EPppPanic_IETFCalbackInvalid,
+    EPppPanic_IETFNoCalback,
+    EPppPanic_IncorrectNcpNotif,
+    EPppPanic_InvalidData,
+    EPppPanic_NullBcaFactory,
+    EPppPanic_NullBca,
+    EPppPanic_UnexpectedBcaOpen,
+    EPppPanic_BcaStartupAlreadyActive,
+    EPppPanic_IllegalBcaControlStep,
+    EPppPanic_IllegalHdlcState,
+    EPppPanic_UnexpectedSCPRMessage,
+    EPppPanic_SpuriousError,
+    EPppPanic_LCPFailedToStart
+  	};
+
+//
+// Panic
+//
+
+static inline void PppPanic(TPppPanic aPanic)
+//
+// Panic the Protocol
+//
+	{
+   _LIT(KPppDesc, "PPP");
+	User::Panic(KPppDesc,aPanic);
+	}
+
+
+//
+// PPP Internal LCP Constants
+//
+
+const TInt KPppDefaultFrameSize = 1500;
+
+enum TMSCBCPAction
+	{
+	EMSCBCPActionRequireClientSpecifiedNumber  = ECallbackActionMSCBCPRequireClientSpecifiedNumber,
+	EMSCBCPActionAcceptServerSpecifiedNumber   = ECallbackActionMSCBCPAcceptServerSpecifiedNumber,
+	EMSCBCPActionOverrideServerSpecifiedNumber = ECallbackActionMSCBCPOverrideServerSpecifiedNumber
+	};
+
+//
+
+class TPppFcs16;
+class TPppFcs32;
+class MPppRecvr;
+class MPppFsm;
+class CPppLcp;
+class CPppLinkBase;
+class CNifFactory;
+
+//
+// Other simple PPP Frame Receivers
+//
+
+/**
+Adds extra PPP Recv channels to a class T
+*/
+template <class T>
+class TPppExtraRecvr : public MPppRecvr
+	{
+public:
+	TPppExtraRecvr<T>(T* aClass, void (T::*aRecvFn)(RMBufChain&), void (T::*aFlowFn)(), 
+		CPppLcp* aLcp, TPppPhase aPhase, TUint aId, void (T::*aFrameErrFn)(), void (T::*aKillFn)())
+		: MPppRecvr(aLcp, aPhase, aId), iClass(aClass), iRecvFn(aRecvFn), iFlowFn(aFlowFn), 
+			iFrameErrFn(aFrameErrFn), iKillFn(aKillFn){}
+		virtual void FrameError()
+		{ (iClass->*iFrameErrFn)(); }
+		virtual void KillProtocol()
+		{ (iClass->*iKillFn)(); }
+
+	virtual TBool RecvFrame(RMBufChain& aPacket)
+		{ (iClass->*iRecvFn)(aPacket); return ETrue; };
+	virtual void FlowOn()
+		{ (iClass->*iFlowFn)(); }
+private:
+	T* iClass;
+	void (T::*iRecvFn)(RMBufChain&);
+	void (T::*iFlowFn)();
+	void (T::*iFrameErrFn)();
+	void (T::*iKillFn)();
+	};
+
+//
+// PPP Options
+//
+
+class RPppOption : public RMBufChain
+	{
+public:
+	RPppOption();
+	RPppOption(RMBufChain& aChain);
+	inline const RPppOption& operator=(const RMBufChain& aChain);
+	void SetL(TUint8 aType, const TAny* aPtr, TInt aLen);
+	TUint8 OptType() const;
+	void SetType(const TUint8 aType);
+	TInt ValueLength() const;
+	void SetValueLength(TInt aLen);
+	TUint8* ValuePtr();
+	const TUint8* ValuePtr() const;
+	inline static RPppOption& Cast(RMBufChain& aChain);
+	inline static const RPppOption& Cast(const RMBufChain& aChain);
+private:
+	// These probably belong in the MBuf manager
+	TInt MaxLength() const;
+	TInt SetLength(TInt aLen);
+	};
+
+enum TPppOptResponse
+	{
+	EPppOptAck,
+	EPppOptNak,
+	EPppOptReject
+	};
+
+class MPppOptionsExtender;
+NONSHARABLE_CLASS(MPppOptionHandler)
+	{
+	friend class MPppOptionsExtender;
+protected:
+	MPppOptionHandler();
+	void OptRegister(MPppOptionsExtender* aExtender, const TUint8* aOptList, TInt aNumOpts);
+	virtual void OptNegotiationStarted();
+	virtual void OptNegotiationAborted();
+	virtual void OptNegotiationComplete();
+	virtual void OptFillinConfigRequestL(RPppOptionList& aRequestList);
+	virtual TPppOptResponse OptCheckConfigRequest(RPppOption& aOption);
+	virtual void OptApplyConfigRequest(RPppOption& aOption);
+	virtual void OptRecvConfigAck(RPppOption& aOption);
+	virtual void OptRecvConfigNak(RPppOption& aOption, RPppOptionList& aReqList);
+	virtual void OptRecvConfigReject(RPppOption& aOption, RPppOptionList& aReqList);
+protected:
+	TInt iNumOptions;
+	const TUint8* iOptionList;
+private:
+	TDblQueLink iOptHandlerLink;
+	};
+
+//
+// PPP Finite State Machine
+//
+
+const TInt KPppFsmTerminateRequestTimeout = 3000; // RFC 1661 4.6
+const TInt KPppFsmTerminateTimeout = KPppFsmTerminateRequestTimeout; // For back compatibility
+const TInt KPppFsmLengthenedTerminateTimeout = 30000;		// 30 secs
+const TInt KPppFsmTerminateRequestRetries = 2; // RFC 1661 4.6
+const TInt KPppFsmTerminateAckTimeout = 500 + KPppFsmTerminateRequestTimeout; // RFC 1661 3.7
+const TInt KPppFsmRequestTimeout = 3000;
+const TInt KPppFsmRequestMaxTimeout = 60000;
+const TInt KPppFsmLengthenedRequestTimeout = 40000;			// 40 secs
+const TInt KPppFsmRequestRetries = 10;
+const TInt KPppFsmTimerPriority = 10;
+
+#define __DECLARE_FSM_NAME(t) __iFsmName=t
+
+const TInt KPppFsmNonConvergeLimit = 4;
+const TUint KPppRequestIdAnswered = 0x80000000;
+
+//
+// PPP Link Protocols
+//
+
+/**
+Calculates the CCITT CRC-16 used by PPP in HDLC framing.
+@internalTechnology
+*/
+class TPppFcs16
+	{
+public:
+	inline TPppFcs16();
+	inline void Init();
+	void Calc(const TUint8* aPtr, const TUint8* aEnd);
+	inline void CalcByte(TUint8 aByte);
+	inline TUint16 Fcs() const;
+	inline TBool IsGood() const;
+	
+private:
+	// WINS can't handle static const members initialized here, so use an enum
+	enum
+		{
+		/** Initial FCS value */
+		KPppInitFcs16 = 0xffff,
+		/** Good final FCS value */
+		KPppGoodFcs16 = 0xf0b8
+		};
+	/** CRC value */
+	TUint16 iFcs;		
+	/** Fast CRC calculation table */
+	static const TUint16 FcsTable[256];
+	};
+
+/**
+Calculates the CCITT CRC-32 used as an option by PPP in HDLC framing.
+@internalTechnology
+*/
+class TPppFcs32
+	{
+public:
+	inline TPppFcs32();
+	inline void Init();
+	void Calc(const TUint8* aPtr, const TUint8* aEnd);
+	inline void CalcByte(TUint8 aByte);
+	inline TUint32 Fcs() const;
+	inline TBool IsGood() const;
+	
+private:
+	// WINS can't handle static const members initialized here, so use an enum
+	enum
+		{
+		/** Initial FCS value */
+		KPppInitFcs32 = 0xffffffff,
+		/** Good final FCS value */
+		KPppGoodFcs32 = 0xdebb20e3
+		};
+	/** CRC value */
+	TUint32 iFcs;		
+	/** Fast CRC calculation table */
+	static const TUint32 FcsTable[256];
+	};
+
+/*
+// Support for PPP components as external DLLs
+class CPppExtDllRef : public CAsyncOneShot
+	{
+public:
+	CPppDllRef();
+	~CPppDllRef();
+	void UnloadMe();
+protected:
+	virtual void RunL();
+private:
+	RLibrary iDll;
+	TDblQueLink iLink;
+	};
+
+class MPppExtDll
+	{
+public:
+	IMPORT_C virtual ~MPppExtDll();
+	virtual void DllInstallL()=0;
+	virtual void DllRemove()=0;
+private:
+	friend class CPppExtDllRef;
+	CPppExtDllRef* iPppDllRef;
+	};
+*/
+
+//
+// Other simple PPP Frame Receivers
+//
+
+/**
+Base class for link protocols
+@internalTechnology
+*/
+NONSHARABLE_CLASS(CPppLinkBase) : public CBase
+	{
+public:
+	virtual ~CPppLinkBase();
+	// Implemented by link protocols
+	virtual void CreateL()=0;
+	virtual TInt Send(RMBufChain& aPacket, TUint aPppId=KPppIdAsIs)=0;
+	virtual void OpenL()=0; // Open/Close from LCP
+	virtual void Close()=0;
+	virtual void StartL()=0;
+	virtual void Stop(TInt aReason, TBool aLinkDown=ETrue)=0;
+	virtual void GetSendRecvSize(TInt& aMaxRecvSize, TInt& aMaxSendSize)=0;
+	virtual void GetDataTransfer(RPacketContext::TDataVolume&)=0;
+	virtual TInt SpeedMetric()=0;
+	inline void NewCompressor(const CPppCompressor* aCompressor);
+	inline void NewDeCompressor(const CPppDeCompressor* aDeCompressor);
+	CPppLinkBase* PppCreateLinkL(CPppLcp* aLcp, const TDesC& aNifName);
+protected:
+	CPppLinkBase(CPppLcp* aLcp);
+	// Used by link protocols
+	inline void NotifyLinkUp();
+	inline void NotifyLinkDown(TInt aReason);
+	inline void DeliverToLcp(RMBufChain& aPacket);
+protected:
+	CPppLcp* iPppLcp;
+	CPppCompressor* iPppCompressor;
+	CPppDeCompressor* iPppDecompressor;
+	};
+
+#include <networking/pppbase.inl>
+
+#endif