tcpiputils/networkaddressandporttranslation/inc/translationtable.h
changeset 0 af10295192d8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tcpiputils/networkaddressandporttranslation/inc/translationtable.h	Tue Jan 26 15:23:49 2010 +0200
@@ -0,0 +1,138 @@
+// 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:
+// NAPT (Network Address & Port translation Code )
+// 
+//
+
+/**
+ @file 
+ @internalComponent
+ @prototype
+*/
+
+#ifndef __TRANSLATIONTABLE_H
+#define __TRANSLATIONTABLE_H
+
+
+#include <e32std.h>
+
+#include <e32base.h>
+#include <es_sock.h> // for BigEndian
+#include <icmp6_hdr.h>
+#include <ip4_hdr.h>
+#include <tcp_hdr.h>
+#include <in_pkt.h>
+#include <ext_hdr.h>
+#include <in_chk.h>
+#include "naptconfigtable.h"
+
+//Hash Table Array Size
+const TUint16 KTranslationHashTableSize= 	111;
+
+//flags for TCP session close
+const TUint8 KTcpClosePacketOUT			=0x40 ;
+const TUint8 KTcpClosePacketIN			=0x80 ;
+const TUint8 KTcpCloseDeletePacket = KTcpClosePacketOUT | KTcpClosePacketIN |  KTcpCtlACK ;
+
+//TImer Default Values.. All values in Seconds..
+const TUint32 KTimerMaxSeconds				=2147 ;	 //Maximum Timer Interval 
+const TUint32 KTableScanIntervalDefault		=3*60  ;   //3 minutes
+//Inactive Protcol Timeout Default Values
+const TUint32 KTcpIdleTimeOutDefault			=24*60*60; //One day
+const TUint32 KUdpIdleTimeoutDefault			=3*60;	   //3 minutes
+const TUint32 KIcmpIdleTimeoutDefault			=3*60;	   //3 minutes
+//Tcp Close Wait Time for Napt Table Node Deletion
+const TUint32 KTcpOpenTimeoutDefault		=30 ; // 30 seconds
+const TUint32 KTcpCloseTimeoutDefault		=4*60;	   // 4 minutes
+
+//Napt Port Range
+const TUint16  KNaptPort_HIGH 		 		=64000;
+const TUint16  KNaptPort_LOW		 		=61000;
+
+//IcmpQueryIdRange
+const TUint16  KNaptIcmpQuery_HIGH			=30000;
+const TUint16  KNaptIcmpQuery_LOW			=28000;
+
+class CNaptTimer;
+class CNaptIPPortMap;
+
+NONSHARABLE_CLASS(CNaptIPPortMap): public CBase
+	{
+
+		friend class CProtocolNapt;
+	public:
+	
+		static CNaptIPPortMap* NewL();
+    	~CNaptIPPortMap();
+    	
+	public:     
+
+		TUint16     iSrcPort;    	//original source Address port
+		TUint16 	iDstPort;		//just needed to compare in EntryExists function
+		TUint16 	iTrPort;		//final translated  port
+		TUint8 		iProtocolFlag;  //soft state for tcp session close
+		TUint     	iProtocolType;  //type of protocol TCP/UDP/ICMP
+		TUint32 	iSrcIpAddr;     //original source address
+ 		TUint32 	iTrIpAddr;      //final translated ip address
+ 		TUint32 	iDstIpAddr;     //just needed to compare in EntryExists function
+		TUint32		iCurTime;       //used for deleting the entry based on the timout values
+		TNaptConfigInfo* iConfigInfo; //used for fetching packet specific configuration in InBound hook
+   		TSglQueLink* iLink;
+    };  
+   
+class   TNaptIPPortMap : public TSglQue<CNaptIPPortMap>
+	{
+public:
+	TNaptIPPortMap():
+	TSglQue<CNaptIPPortMap>(_FOFF(CNaptIPPortMap, iLink)) {};
+	};
+
+
+typedef class TSglQueIter<CNaptIPPortMap> TNaptTableIter;
+
+class TNaptTableMapMgr
+	{
+		friend class CProtocolNapt;
+		
+	public:	
+		TNaptTableMapMgr();	
+		~TNaptTableMapMgr();
+		
+		inline TInt FindBucket(TInt aPortNo){	return aPortNo % KTranslationHashTableSize;	}
+		inline TInt GetIndexedPortCount(){ return iBucketsInUse;}
+		CNaptIPPortMap* FindOrCreateNaptEntryL( TUint aProtocolType,const TUint32& aSrcAddr,const TUint32&  aDstAddr,const TUint16 aSrcPort,const TUint16 aDstPort, const TNaptConfigInfo *aConfigInfo);
+		TBool VerifySender(const CNaptIPPortMap* aTableNode, const TUint32& aSrcIp,TUint16 aSrcPort);
+		CNaptIPPortMap* GetIPTranslationNode(TUint16 aDstPortNo);
+		void DeleteNodeInIndexedList(TInt aIndex, CNaptIPPortMap *aTableNode);
+		void TimerComplete();
+		void HandleTcpConnectionPhases(	TInet6Checksum<TInet6HeaderTCP> &aPacket, CNaptIPPortMap* aTableNode,const TInt direction);
+		
+	private :
+		CNaptIPPortMap *AllocateTranslationNodeL(TUint  aProtocolType,const TUint32& aSrcAddr,const TUint32& aDstAddr,const TUint16 aSrcPort ,const TUint16 aDstPort, const TNaptConfigInfo *aConfigInfo, TUint16 aQueryId=0);
+		void DeleteNaptTableNode( CNaptIPPortMap* aTableNode);
+
+	private : 
+		TNaptIPPortMap 		iIPPortMap[KTranslationHashTableSize];
+		TUint16  	iLastPort;
+		TInt16  	iBucketsInUse;
+		TUint16 	iIcmpQueryId;
+		TUint32 	iPublicGatewayIP;
+		CNaptTimer* iTimerPtr;
+	
+	};
+
+
+	
+
+#endif //translation.h