--- /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__