--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/networkingtestandutils/ipanalyzer/inc/engine.h Tue Jan 26 15:23:49 2010 +0200
@@ -0,0 +1,456 @@
+// Copyright (c) 2004-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:
+// engine.h - protocol analyzer engine header
+// The monitoring of IPv6 header includes some recursivity when
+// calling to monitor the next packet but it shouldn't be a problem
+// However, in case of problrems it could easily turn into a loop
+//
+
+
+
+/**
+ @internalComponent
+*/
+
+#ifndef __ENGINE_H
+#define __ENGINE_H
+
+#include <es_sock.h>
+#include <in_sock.h>
+
+#if EPOC_SDK >= 0x07010000
+// here would go the includes that you would
+// need for opening a link or links
+#elif EPOC_SDK >= 0x06010000
+#include <agentclient.h>
+#include <connectprog.h>
+#else
+#include <netdial.h>
+#endif
+
+#define SECOND 1000000
+
+#define MIN_FACTOR 0.05
+#define MAX_FACTOR 1
+#define STEP 0.05
+#define MINI_STEP 0.01
+
+#define KProtocolInetEsp 50 //Protocols numbers. Not defined in any system include
+#define KProtocolInetAh 51
+
+#define IPV4_ADDR_SIZE 16 //IPV4 size in char
+#define IPV6_ADDR_SIZE 40 //IPV6 size in char
+
+//Protocols no defined in .h's
+#define KIPv6HopByHopHdr 0
+#define KIPv6RoutingHdr 43
+#define KIPv6FragmentHdr 44
+#define KIPv6ESPHdr 50
+#define KIPv6AuthenticationHdr 51
+#define KIPv6DestOptHdr 60
+#define KIPv6NoNextHdr 59
+
+//ICMP codes not defined in .h's
+#define KInet6ICMP_HopLimitExceeded 0
+#define KInet6ICMP_FragReassExceeded 1
+
+#define KInet6ICMP_NoRoute 0
+#define KInet6ICMP_AdminProhibition 1
+#define KInet6ICMP_NotNeighbour 2
+#define KInet6ICMP_AddrUnreach 3
+#define KInet6ICMP_PortUnreach 4
+
+#define KInet6ICMP_ErrHdrField 0
+#define KInet6ICMP_NextHdrUnknown 1
+#define KInet6ICMP_OptionUnkown 2
+
+#define MAX_READ_DATA 512
+
+
+struct TPreferences
+{
+ TBool iDumpIPv4; //To dump dropped IPv4 packets
+ TBool iDumpIPv6; //To dump dropped IPv6 packets
+ TBool iDumpIPSEC; //To dump dropped ipsec packet
+ TInt iProtocol; //icmp, ip, tcp, udp
+ TUint iPort; //To be used with tcp or udp
+ TBool iViewIPHdr;
+ TInt iNumBlades;
+};
+
+#if 0
+struct SMonIPv4Info
+{
+ TBool iIPVersion;
+ TBool iIPHdrLen;
+ TBool iIPTOS;
+ TBool iIPTotalLen;
+ TBool iIPId;
+ TBool iIPFlags;
+ TBool iIPOffset;
+ TBool iIPTTL;
+ TBool iIPProtocol;
+ TBool iIPChksum;
+ TBool iIPSrcAddr;
+ TBool iIPDstAddr;
+
+ TBool iICMPType;
+ TBool iICMPCode;
+ TBool iICMPChksum;
+
+ TBool iTCPSrcPort;
+ TBool iTCPDstPort;
+ TBool iTCPSeq;
+ TBool iTCPAckNum;
+ TBool iTCPHdrLen;
+ TBool iTCPFlags;
+ TBool iTCPHdrWinSize;
+ TBool iTCPChksum;
+ TBool iTCPHdrUrgPtr;
+
+ TBool iUDPSrcPort;
+ TBool iUDPDstPort;
+ TBool iUDPLen;
+ TBool iUDPChksum;
+
+ TBool iAHProtocol;
+ TBool iAHHdrLen;
+ TBool iAHSPI;
+ TBool iAHSeq;
+
+ TBool iESPSPI;
+ TBool iESPSeq;
+
+};
+#else
+# define SMonIPv4Info SMonIpInfo
+# define SMonIPv6Info SMonIpInfo
+#endif
+struct SMonIpInfo
+{
+
+ TBool iIPVersion;
+ union
+ {
+ TBool iIPTraffic; // IPv6
+ TBool iIPTOS; // IPv4
+ };
+ TBool iIPFlowLabel;
+ union
+ {
+ TBool iIPTotalLen; // IPv4
+ TBool iIPPayloadLen;// IPv6
+ };
+ union
+ {
+ TBool iIPNextHdr; // IPv6
+ TBool iIPProtocol; // IPv4
+ };
+ union
+ {
+ TBool iIPHopLimit; // IPv6
+ TBool iIPTTL; // IPv4
+ };
+
+ TBool iIPSrcAddr;
+ TBool iIPDstAddr;
+
+ TBool iIPHdrLen; // IPv4
+ TBool iIPId; // IPv4
+ TBool iIPFlags; // IPv4
+ TBool iIPOffset; // IPv4
+ TBool iIPChksum; // IPv4
+
+ TBool iICMPType;
+ TBool iICMPCode;
+ TBool iICMPChksum;
+ TBool iICMPParameter; //Particular Info depending on ICMP Code and Type
+
+ TBool iTCPSrcPort;
+ TBool iTCPDstPort;
+ TBool iTCPSeq;
+ TBool iTCPAckNum;
+ TBool iTCPHdrLen;
+ TBool iTCPFlags;
+ TBool iTCPHdrWinSize;
+ TBool iTCPChksum;
+ TBool iTCPHdrUrgPtr;
+ TBool iTCPOptions;
+
+ TBool iUDPSrcPort;
+ TBool iUDPDstPort;
+ TBool iUDPLen;
+ TBool iUDPChksum;
+
+ TBool iHOPNextHdr;
+ TBool iHOPHdrExtLen;
+ TBool iHOPOptionType;
+ TBool iHOPOptionLen;
+
+ TBool iDSTNextHdr;
+ TBool iDSTHdrExtLen;
+ TBool iDSTHomeAddr;
+ TBool iDSTBindingUpdate;
+ TBool iDSTBindingRequest;
+ TBool iDSTBindingAck;
+ TBool iDSTPad;
+ TBool iDSTUnknown;
+
+ TBool iRTNextHdr;
+ TBool iRTHdrExtLen;
+ TBool iRTRoutingType;
+ TBool iRTSegLeft;
+ TBool iRTSLBitMap;
+ TBool iRTAddresses;
+
+ TBool iFRAGNextHdr;
+ TBool iFRAGFragOffset;
+ TBool iFRAGMFlag;
+ TBool iFRAGId;
+
+ TBool iAHProtocol;
+ TBool iAHHdrLen;
+ TBool iAHSPI;
+ TBool iAHSeq;
+
+ TBool iESPSPI;
+ TBool iESPSeq;
+
+};
+
+
+struct SMonStatInfo
+{
+ TUint iTotalPackets;
+ TUint iIPv4Packets;
+ TUint iIPv6Packets;
+ TUint iTCPPackets;
+ TUint iUDPPackets;
+ TUint iICMPPackets;
+ TUint iExtPackets;
+};
+
+class CRotorAppView;
+class CRotorReceiver;
+class CRotorIPv6Receiver;
+class CRotorDumper;
+class CRotorBraker;
+
+class CRotorEngine : public CTimer
+{
+public:
+ //constructor
+ CRotorEngine(CRotorAppView *aAppView);
+
+ //destructor
+ ~CRotorEngine();
+
+ //second phase constructor
+ void ConstructL(const TPreferences& aPref);
+ void GetPreferences(TPreferences &aPref) const;
+ static void DefaultPreferences(TPreferences &aPref);
+ CRotorReceiver *StartReceiver(const TDesC &aName);
+ void FirstRun();
+ void StartL();
+ void Stop();
+ void IncreaseSpeed();
+ void DecreaseSpeedL();
+ void PacketReceived();
+
+ inline SMonIPv4Info *MonIPv4Info()
+ {return &iMonIPv4Info;}
+ inline SMonIPv6Info *MonIPv6Info()
+ {return &iMonIPv6Info;}
+ inline RSocketServ &SocketServ()
+ {return iSockServ;}
+
+protected:
+ //void UpdateRotor();
+ void UpdateSpeedL();
+
+ //Issues next RunL execution
+ void IssueRequest();
+
+ // will send all the packets
+ void RunL();
+
+ //Cancel Packet Sending
+ void DoCancel();
+
+private:
+ void SetNetworkUp() const;
+
+public:
+ // General option. Public to make it easier to access from the dialog
+ TPreferences iPref;
+
+ TBool iProbeActive; // IP Probe Hook availabe
+ TBool iIPv4Active; //IPv4 packets dump available
+ TBool iIPv6Active; //IPv6 packets dump available
+ TBool iIPSECActive; //IPSEC packets dump available
+ SMonStatInfo iStatInfo;
+ TBool iShowPackets; //Tells the engine to avoid using the console
+ CRotorAppView *iAppView;
+
+private:
+ RSocketServ iSockServ;
+ CRotorReceiver *iReceiver; //AO listening IPv4
+ CRotorReceiver *iIPv6Receiver; //AO listening IPv6
+ CRotorReceiver *iDumper; //AO listening IPSEC socket
+ CRotorBraker *iBraker; //AO that brakes the rotor
+ TReal iFactor;
+ TBool iPacketReceived;
+ //TUint iRecvPackets;
+ TReal iPartialPackets;
+ TTime iInitTime;
+ SMonIPv4Info iMonIPv4Info;
+ SMonIPv6Info iMonIPv6Info;
+
+ //TBool iRunning;
+
+#if EPOC_SDK >= 0x07010000
+ // Here would go the member variable you would use
+ // to open a link or links
+#elif EPOC_SDK >= 0x06010000
+ RGenericAgent xnetdial; // Use GenConn for R6.1+
+#else
+ RNetDial xnetdial; // To set the net UP
+#endif
+};
+
+
+
+class CRotorListener : public CActive
+{
+public:
+ //constructor
+ CRotorListener(CRotorAppView *aAppView, CRotorEngine *aEngine);
+
+ //destructor
+ ~CRotorListener();
+
+ //second phase constructor
+ void ConstructL();
+ void FirstRun();
+ void Start();
+
+
+protected:
+ //void UpdateRotor();
+
+ //Issues next RunL execution
+ void IssueRequest();
+
+
+ // will send all the packets
+ //void RunL();
+
+ void Stop() const;
+
+ //Cancel Packet Sending
+ void DoCancel();
+
+ TBool Filter(const TDesC8 &aPacket) const;
+
+ void ViewData(const TUint8 *aData,TUint aSize);
+
+ void MonitorIpPacket(const TDesC8 &aPacket);
+
+ TUint MonitorIPv4(const TDesC8 &aPacket, const SMonIpInfo &aMonitor, TUint &aNext);
+ TUint MonitorIPv6(const TDesC8 &aPacket, const SMonIpInfo &aMonitor, TUint &aNext);
+ TUint MonitorICMPv4(const TDesC8 &aPacket, const SMonIpInfo &aMonitor, TUint &aNext);
+ TUint MonitorICMPv6(const TDesC8 &aPacket, const SMonIpInfo &aMonitor, TUint &aNext);
+ TUint ICMPv4Specific(const TDesC8 &aPacket, const SMonIpInfo &aMonitor, TUint &aNext);
+ TUint ICMPv6Specific(const TDesC8 &aPacket, const SMonIpInfo &aMonitor, TUint &aNext);
+ TUint MonitorTCP(const TDesC8 &aPacket, const SMonIpInfo &aMonitor, TUint &aNext);
+ TUint MonitorUDP(const TDesC8 &aPacket, const SMonIpInfo &aMonitor, TUint &aNext);
+ TUint MonitorESP(const TDesC8 &aPacket, const SMonIpInfo &aMonitor, TUint &aNext);
+ TUint MonitorAH(const TDesC8 &aPacket, const SMonIpInfo &aMonitor, TUint &aNext);
+ TUint MonitorHopByHopHeader(const TDesC8 &aPacket, const SMonIpInfo &aMonitor, TUint &aNext);
+ TUint MonitorDestOptHeader(const TDesC8 &aPacket, const SMonIpInfo &aMonitor, TUint &aNext);
+ TUint MonitorRoutingHeader(const TDesC8 &aPacket, const SMonIpInfo &aMonitor, TUint &aNext);
+ TUint MonitorFragmentHeader(const TDesC8 &aPacket, const SMonIpInfo &aMonitor, TUint &aNext);
+
+ //aPacket contains the full packet
+ const TUint8 *FindTransportProtocol(const TDesC8& aPacket) const;
+ void ErrorL(const TDesC& string,TInt error);
+
+protected:
+ CRotorAppView *const iAppView;
+ CRotorEngine *const iEngine;
+ //RSocketServ iSockServ;
+ RSocket iSocket;
+ HBufC8* iReceivedData;
+ TPtr8 iBuf;
+ TInt iErrPackets;
+ TRequestStatus iWriteStatus;
+};
+
+
+//
+// CRotorReceiver: Receives IPv4 packets to move the rotor
+//
+
+
+class CRotorReceiver : public CRotorListener
+{
+friend class CRotorDumper; //To let this class use the monitoring functions
+public:
+ //constructor
+ CRotorReceiver(CRotorAppView *aAppView, CRotorEngine *aEngine);
+
+ //second phase constructor
+ void ConstructL(TUint aProtocol, const TDesC &aName);
+
+protected:
+ void RunL();
+private:
+ TInt iSwapIpHeader;
+};
+
+class CRotorBraker : public CTimer
+{
+public:
+ //constructor
+ CRotorBraker(CRotorEngine *aEngine);
+
+ //destructor
+ ~CRotorBraker();
+
+ //second phase constructor
+ void ConstructL();
+
+ void Start();
+ void ReIssueRequest();
+
+protected:
+
+ //Issues next RunL execution
+ void IssueRequest();
+
+ void FirstRun();
+
+ // will send all the packets
+ void RunL();
+
+ void Stop() const;
+
+ //Cancel Packet Sending
+ void DoCancel();
+
+private:
+ CRotorEngine *iEngine;
+};
+
+#endif