diff -r 000000000000 -r 7f656887cf89 commands/ping/pingmodel.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/commands/ping/pingmodel.h Wed Jun 23 15:52:26 2010 +0100 @@ -0,0 +1,291 @@ +// Copyright (c) 2000-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: +// pingmodel.h - icmp echo client engine +// This software has been implemented in the 6PACK +// project at the Mobile Networks Laboratory (MNW) +// http://www.research.nokia.com/projects/6pack/ +// + +#if !defined __PINGMODEL_H +#define __PINGMODEL_H + +#include +#include + +#include +#include "in_icmp.h" +#include + +#include "const.h" + +#ifdef IAPSETTING +#include +#endif + +// constants + +#define TIMESTAMP_SIZE sizeof(TInt64) //Timestamp Size + +#define DEFDATALEN 64 - TIMESTAMP_SIZE //default data length + + +#define SECOND 1000000 // One second is 1000000 us. (1 us. per tick) + +//ICMPv6 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_PATTERN_LENGTH 16 //Must match the value of the pattern in the RSS file!!! +#ifdef IAPSETTING +#define MAX_IAP_LENGTH 5 //Must match the value of the pattern in the RSS file!!! +#endif +class CPingContainer; +class CPingSender; + + +const TUint KPingQuiet = 0x01; +const TUint KPingVerbose = 0x02; +const TUint KPingPackLimit = 0x04; +const TUint KPingDebug = 0x08; + +//Contains engine's saved preferences +class TPreferences +{ +public: + TUint iFlags; + //Contains: + //Bit 0 TBool iQuiet; //No packet info, just statistics + //Bit 1 TBool iVerbose; //Verbose Output. All ICMP packets, not only Echo reply + //Bit 2 TBool iPackLimit; //Indicates if unlimited packet number + //Bit 3 TBool iDebug; //Set the SO_DEBUG flag in the socket + + TUint iSecWait; //Time between sent packets (Default 1 second) + TUint iPacketDataSize; //Default Data Size (not including ICMP header) + TUint iTotalPackets; //Number of ICMP Echo Request packets to send + TUint iLastSecWait; //Time to wait for the Last packet. Default 2 + TBuf iHostname; + TBuf iPattern; //Pattern to fill the packet.Default 0xFF (Stored as text) + +#ifdef IAPSETTING + TUint iIAP; +#endif + //Not used yet + //TUint iHopLimit; //Time-to-live in hops default 255 (0 means not set) + //TBool iNumericOutput; //Resolve adresses by default +}; + +class CPingSender; +class CPingSingleSender; +//Ping Utility class. Contains All the ping model and create active objects to +// send and receive from the socket +class CPing : public CActive +{ +friend class CPingSender; +friend class CPingSingleSender; +public: + CPing(); + ~CPing(); + + void ConstructL(TPreferences aPref); + + //return the current preferences + void GetPreferences(TPreferences &aPref); + static void DefaultPreferences(TPreferences &aPref); + void SetConsole(CPingContainer *aConsole); + TDes* GetHostName(); + void SetHostName(const TDesC& ahostname); + + void EndPingL(); + TBool IsRunning(); + void BeginL(); + +#ifdef IAPSETTING + void StartConnection(); +#endif + +protected: + + TUint16 in_chksum(TUint16 *data, TUint len); + void ComposeFirstICMPPacket(); //Compose a whole ICMPPacket + void ComposeICMPPacket(); //Only composes timestamp and sequence number + void StampPacket(); // Modify the composed packet with fresh timestamp and checksum + void NextSeq(); + + void CloseAll(); //Closes all the resources + void PrintICMPData(const TDesC8& adata); + + void IssueRequest(); + void RunL(); //Segment of code to execute + void DoCancel(); //Stops Execution of Ping + +private: + void CreateSocketAOL(); + void Statistics(); + void WriteLineIfNotQuiet(const TDesC& abuf); + void ErrorL(const TDesC& string,TInt error); + void CLR(TUint16 num); + void SET(TUint16 num); + TBool TEST(TUint16 num); + TPtrC PacketType(ThdrICMP *hdr); + //TPtrC PacketTypev6(TInet6HeaderICMP_Echo *aHdr); + void PacketTypev6(TDes& buf,ThdrICMP *aHdr); + void Stop(); + TUint16 RandomNumber(); + +private: + + CPingContainer *iConsole; + RSocketServ iSockServ; // Socket Server + RSocket iSocket; // Socket + RHostResolver iHostResolv; //Resolver + //TRequestStatus status; // To wait for socket operations completion + + CPingSender *iPingSender; + TUint32 iDup[8]; //Calculates duplicate packets up to 256 packets, after + //it begins again using modulus (%, MOD) + + HBufC8 *iPacketData; + TPtr8 iPacket; + TUint16 iId; + + TUint iMaxTime; //Maximum time + TUint iMinTime; //Minimum time + TUint iTimeSum; //all times sum + TBuf iHostname; // Contains hostname to ping + + TUint iDupPackets; //Duplicated packets + TBool iRunning; + TUint iStage; //Stages to use non-blocking resolver in RunL + TNameEntry iEntry; //contains address resolution data + + HBufC8 *iReceivedDataBuffer; + TPtr8 iReceivedData; + + TUint iType; + + TInt64 iSeed; //Used for random iId generation + +public: + TBool iNumericOutput; //Resolve adresses by default + TUint iSecWait; //Time between sent packets (Default 1 second) + TUint iPacketDataSize;//Default Data Size (not including ICMP header) + TBool iQuiet; //No packet info, just statistics + TUint iHopLimit; //Time-to-live in hops default 255 (0 means not set) + TBool iVerbose; //Verbose Output. All ICMP packets, not only Echo reply + TBool iPackLimit; //Indicates if unlimited packet number + TUint iSentPackets; //ICMP Echo Request Packets sent til now + TUint iRecvPackets; //ICMP Echo Reply Packets received til now + TUint iTotalPackets; //Number of ICMP Echo Request packets to send + TBuf iPattern; //Pattern to fill the packet.Default 0xFF + TBool iDebug; //Set the SO_DEBUG flag in the socket + TUint iLastSecWait; //Time to wait for the Last packet. Default 2 + TUint iChksumErrors; + TUint iSockErrors; + TInetAddr iHostAddr; //Address to Ping +#ifdef IAPSETTING + TUint iIAP; + RGenericAgent iGenericAgent; // To establish the connection with the ISP. +#endif +}; + +// Used by CPing +// Send packets using a CTimer (CActive) object +// Not intended to run alone!!! + +class CPingSender : public CTimer +{ +public: + //constructor + CPingSender(); + + //destructor + ~CPingSender(); + + //second phase constructor + void ConstructL(CPing *aPingModel); + void FirstRunL(); + +protected: + //Issues next RunL execution + void IssueRequest(); + + //Issues last RunL execution + void IssueLastRequest(); + + // will send all the packets + void RunL(); + + //Cancel Packet Sending + void DoCancel(); + + void SendFirstPacketL(); + void SendPacket(); + +private: + CPing *iPingModel; + CPingSingleSender *iSender; + + +}; + + +// Used by CPingSender +// Sends packets. Cannot be done directly by CPingSender because there are conflicts with +// diferent TRequestStatus. + + +class CPingSingleSender : public CActive +{ +public: + //constructor + CPingSingleSender(CPing *aPingModel); + + //destructor + ~CPingSingleSender(); + + void FirstRunLD(); + void NextPacket(); + +protected: + //Issues next RunL execution + void IssueRequest(); + + //Issues last RunL execution + void IssueLastRequest(); + + // will send all the packets + void RunL(); + + //Cancel Packet Sending + void DoCancel(); + + +private: + CPing *iPingModel; + TUint iUnsent; + +}; + +#endif