diff -r 000000000000 -r af10295192d8 networkingtestandutils/ipanalyzer/inc/engine.h --- /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 +#include + +#if EPOC_SDK >= 0x07010000 +// here would go the includes that you would +// need for opening a link or links +#elif EPOC_SDK >= 0x06010000 +#include +#include +#else +#include +#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