linklayerprotocols/pppnif/INC/VJ.H
changeset 0 af10295192d8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/linklayerprotocols/pppnif/INC/VJ.H	Tue Jan 26 15:23:49 2010 +0200
@@ -0,0 +1,254 @@
+// 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(__VJ_H__)
+#define __VJ_H__
+
+#include <networking/in_tcp.h>
+#include <networking/vjif.h>
+
+const TUint8 KVJDiscard			= 1;
+
+// Limits on the number of slots that can be handled by the VJ code
+// in terms of the enumerated slot number.
+// The VJ code may work with KMinVjSlot=0, but 2 is safer without more testing.
+const TUint8 KMinVjSlot			= 2;
+const TUint8 KDesiredVjSlot		= 15;
+const TUint8 KMaxVjSlot			= 255;
+
+const TUint8 KVjCompSlotId		= 1;
+const TUint8 KVjCompMaskConn	= 0x40;
+const TUint8 KVjCompMaskIp		= 0x20;
+const TUint8 KVjCompMaskPush	= 0x10;
+const TUint8 KVjCompMaskSeq		= 0x08;
+const TUint8 KVjCompMaskAck		= 0x04;
+const TUint8 KVjCompMaskWindow	= 0x02;
+const TUint8 KVjCompMaskUrgent	= 0x01;
+const TUint8 KVjCompMaskSpecialD = KVjCompMaskSeq 
+								| KVjCompMaskAck 
+								| KVjCompMaskWindow 
+								| KVjCompMaskUrgent;
+const TUint8 KVjCompMaskSpecials = KVjCompMaskSpecialD;
+const TUint8 KVjCompMaskSpecialI = KVjCompMaskSeq 
+								| KVjCompMaskWindow 
+								| KVjCompMaskUrgent;
+
+
+const TUint32 KUidVJCompDll		=  0x10000ba8;
+const TUint32 KUidUnicodeVJCompDll		=  0x10003d43;
+
+// moved from ncpip.h
+const TUint KPppIdIp = 0x0021;
+const TUint KPppIdVjCompTcp = 0x002d;
+const TUint KPppIdVjUncompTcp = 0x002f;
+//
+
+class TVJCompHdr
+/**
+Van Jacobson compressed TCP/IP header container class.
+Implements a linked list.
+@internalComponent
+*/
+	{
+public:
+	TVJCompHdr();
+	void			StoreTCPIPHeader(ThdrIP * aHeader);
+	void			RetrieveTCPIPHeader(ThdrIP* aIPHeader, ThdrTCP* aTCPHeader);
+	inline void		SetNextPtr(TVJCompHdr * aNextPtr);
+	inline TVJCompHdr*		NextPtr() const;
+	inline void		SetConnectionNumber(TUint aConnection);
+	inline TUint	ConnectionNumber() const;
+	inline TBool	IsValid() const;
+private:
+	inline void		MarkValid();
+
+private:
+    /** Pointer to the next object in the linked list */
+	TVJCompHdr*		iNextPtr;
+	
+	/** Flag for iConnectionId indicating this object contains valid data */
+	enum {KVJValidFlag = 0x80000000};
+	
+	/** VJ connection number */
+	TUint			iConnectionId;
+	
+	/** IP header */
+	ThdrIP			iIPHeader;
+	
+	/** TCP header */
+	ThdrTCP			iTCPHeader;
+	};
+
+#include <networking/vj.inl>
+
+NONSHARABLE_CLASS(CVJDeCompressor) : public CVJDeCompressorIf
+/**
+Van Jacobson TCP/IP header decompressor (RFC 1144)
+@internalComponent
+*/
+	{
+public:
+	~CVJDeCompressor();
+	//IMPORT_C static CVJDeCompressor* NewL(TUint aSlots);
+	TBool	DecompVJUncomp(RMBufChain& aPacket);
+	TBool	DecompVJComp(RMBufChain& aPacket);
+	void	CRCError();
+	void	ConstructL( CVJCompFactory* aFactory, TUint aSlots );
+	CVJDeCompressor();
+private:
+	inline	void	SetFlag( const TUint aFlag);
+	inline	void	ClearFlag( const TUint aFlag);
+	inline	TBool	TestFlag( const TUint aFlag);
+	void	DecompSWAU(const TUint aChanges, TUint8** aVJCompHeader, ThdrTCP* aTCPHeader, TUint16 aPreviousFrameLength);
+	void	DecompPushFlag(const TUint aChanges, ThdrTCP* aHeader);
+	void	DecompIPId(const TUint aChanges, TUint8** aVJCompHeader, ThdrIP* aIPHeader );
+	TUint16	DecodeDelta( TUint8 ** aVJCompHeader );
+	void	EncodeDelta(TUint8** aVJCompHeader, TUint16 aValue);
+	void	DecompUrgent(TUint8** aVJCompHeader, ThdrTCP* aTCPHeader, TUint aChanges);
+	void	DecompWindow(TUint8** aVJCompHeader, ThdrTCP* aTCPHeader);
+	void	DecompAck(TUint8** aVJCompHeader, ThdrTCP* aTCPHeader);
+	void	DecompSeq(TUint8** aVJCompHeader, ThdrTCP* aTCPHeader);
+	TUint8*	GetVJPtr(RMBufChain &aChain, TUint16* aCurrentFrameLength);
+	void	DecompressFrameL(RMBufChain& aPacket, TUint8 aConnection, TUint8 aChanges, TUint8* const aInitialHeaderPtr, TUint Offset, TUint16 aCurrentFrameLength);
+	void	CopyInNewHeaderL(RMBufChain* aPacket, ThdrIP * aIPHeader, ThdrTCP * aTCPHeader, TUint aCompressedHeaderLength, TUint16 aIPHeaderLength, TUint16 aTCPHeaderLength);
+	ThdrIP*	GetIPHeader(RMBufChain &aChain);
+	void	DoIPChecksum(ThdrIP* aIPHeader, TUint16 aIPHeaderLength);
+	void	CopyRecvHeader(const TUint aConnectionNumber, ThdrIP * aHeader);
+	void	GetStoredRxHeader(const TUint aConnectionNumber, ThdrIP * aIPHeader, ThdrTCP * aTCPHeader);
+	TBool	CheckStoredRxHeader(const TUint aConnection) const;
+	
+private:
+    /** Index of the highest-numbered VJ connection */
+	TUint		iNumVJSlots;
+	
+	/** VJ connection number of the last valid packet received */
+	TUint		iLastRxConn;
+	
+	/** Set to KVJDiscard while discarding received packets due to lost synchronization */
+	TUint		iFlags;
+
+    /** Pointer to start of array of VJ connections */
+	TVJCompHdr* iRxStates;
+	};
+
+#include <networking/vjdecomp.inl>
+
+NONSHARABLE_CLASS(CVJCompressor) : public CVJCompressorIf
+/**
+Van Jacobson TCP/IP header compressor (RFC 1144)
+@internalComponent
+*/
+	{
+public:
+
+	~CVJCompressor();
+	//IMPORT_C static CVJCompressor* NewL( TUint aSlots, TBool aCompressConnId );
+	TInt	VJCompressFrame(RMBufChain& aPacket);
+	void	ConstructL(CVJCompFactory* aFactory, TUint aMaxSlot, TBool aCompressConnId);
+	CVJCompressor();
+
+private:
+	void	EncodeDelta(TUint8** aVJCompHeader, TInt16 aValue);
+	inline TBool	IsDeltaCompressible(TUint32 aDelta) const;
+	ThdrIP*	GetIPHeader(RMBufChain &aChain);
+	TBool	SuitableForVJCompression(ThdrIP* aIPHeader, ThdrTCP* aTCPHeader, TUint* aConnection, ThdrIP* aRetrievedIPHdr, ThdrTCP* aRetrievedTCPHdr);
+	TBool	CompressFrame(	RMBufChain& aPacket, 
+							ThdrIP* aIPHeader, 
+							ThdrTCP* aTCPHeader, 
+							TUint aConnection,
+							ThdrIP* aRetrievedIPHdr,
+							ThdrTCP* aRetrievedTCPHdr);
+	TBool	SendAsRawIP(ThdrIP* aIPHeader, ThdrTCP* aTCPHeader);
+	TBool	IsIPCompressible( ThdrIP* aIPHeader, ThdrIP* aRetrievedIPHdr);
+	TBool	IsTCPCompressible( ThdrTCP* aTCPHeader, ThdrTCP* aRetrievedTCPHdr);
+	TBool	CompressUrgentPtr(TUint8** aVJPtr, TUint8* aChanges, ThdrTCP* aTCPHeader, ThdrTCP* aRetrievedTCPHdr);
+	TBool	CompressWindow(TUint8** aVJPtr, TUint8* aChanges, ThdrTCP* aTCPHeader, ThdrTCP* aRetrievedTCPHdr);
+	TBool	CompressAck(TUint8** aVJPtr, TUint8* aChanges, ThdrTCP* aTCPHeader, ThdrTCP* aRetrievedTCPHdr);
+	TBool	CompressSeq(TUint8** aVJPtr, TUint8* aChanges, ThdrTCP* aTCPHeader, ThdrTCP* aRetrievedTCPHdr);
+	TBool	CompressIPId(TUint8** aVJPtr, TUint8* aChanges, ThdrIP* aIPHeader, ThdrIP* aRetrievedIPHdr);
+	TBool	CompressPush(TUint8* aChanges,  ThdrTCP* aTCPHeader);
+	TBool	IsSameConnAsLast(TUint* aCompressedHdrLen, TUint aConnection);
+	void	SetFirstFewBytes(TUint8* aChanges, TBool aNewConnection, TUint8** aVJHeader, ThdrTCP* aTCPHeader, TUint aConnection);
+	void	CopyInNewTxHeader(RMBufChain& aPacket, TUint8* aCompressedHdr, TUint aOldHeaderLength, TUint aNewHeaderLength);
+	void	DecrementPacketLen( RMBufChain& aPacket, TUint SizeDecrease );
+	TBool	CompressSpecialCases(	TUint8** aVJPtr, 
+									TUint8* const aVJInitialDeltaPtr, 
+									TUint8* aChanges, 
+									ThdrTCP* aTCPHeader, 
+									ThdrTCP* aRetrievedTCPHdr, 
+									ThdrIP* aIPHeader,
+									ThdrIP* aRetrievedIPHdr);
+	void	ConvertFrameToUncompVJ(ThdrIP* aIPHeader, TUint aConnection);
+	inline TUint8* GetTCPOpts(ThdrTCP* aTCPHeader) const;
+	void	CopyTxHeader( ThdrIP* aIPHeader, TUint aConnection);
+	TBool	GetStoredTxHeader(	TUint* aConnection, 
+								ThdrIP * aIPHeader, 
+								ThdrTCP* aTCPHeader, 
+								ThdrIP* aRetrievedIPHdr, 
+								ThdrTCP* aRetrievedTCPHdr);
+	TBool	IPAddressesMatch(ThdrIP* aIPHeader,ThdrIP* aNotherIPHdr);	
+	TBool	TCPPortsMatch(ThdrTCP* aHeader, ThdrTCP* aNotherHdr );
+	
+private:
+    /** Maximum number of VJ connections */
+	TUint		iMaxVJSlots;
+	
+	/** Whether VJ was configured to compress the connection number */
+	TBool		iCompressConnId;
+	
+	/** Connection number of the last packet compressed */
+	TUint		iLastTxConn;
+	
+    /** Pointer to the last element in the LRU circular list */
+	TVJCompHdr*	iLastTxHdr;
+
+    /** Pointer to start of array of VJ connections */
+	TVJCompHdr*	iTxStates;
+	};
+
+#include <networking/vjcomp.inl>
+
+NONSHARABLE_CLASS(CVJFactory) : public CVJCompFactory
+/**
+Factory base for creating a concrete instance of a
+compressor or decompressor object
+@internalTechnology
+*/
+	{
+public:
+	CVJFactory();
+	void InstallL();
+	CVJCompressorIf* NewVJCompressorL( TInt aMaxVJSlots, TInt aCompressConnId);
+	CVJDeCompressorIf* NewVJDeCompressorL(TInt aMaxVJSlots);
+	};
+
+extern "C"
+	{
+/**
+Generates and returns a CVJFactory object.
+This is the polymorphic DLL entry point.
+
+@return New CVJFactory object
+@internalTechnology
+*/
+	IMPORT_C CVJCompFactory* NewVJCompFactoryL(void);
+	}
+
+#endif // __VJ_H__