00001 /* -*- Mode:C++; c-basic-offset:8; tab-width:8 -*- */ 00002 /* 00003 * Copyright (c) 1997 Regents of the University of California. 00004 * All rights reserved. 00005 * 00006 * Redistribution and use in source and binary forms, with or without 00007 * modification, are permitted provided that the following conditions 00008 * are met: 00009 * 1. Redistributions of source code must retain the above copyright 00010 * notice, this list of conditions and the following disclaimer. 00011 * 2. Redistributions in binary form must reproduce the above copyright 00012 * notice, this list of conditions and the following disclaimer in the 00013 * documentation and/or other materials provided with the distribution. 00014 * 3. All advertising materials mentioning features or use of this software 00015 * must display the following acknowledgement: 00016 * This product includes software developed by the MASH Research 00017 * Group at the University of California Berkeley. 00018 * 4. Neither the name of the University nor of the Research Group may be 00019 * used to endorse or promote products derived from this software without 00020 * specific prior written permission. 00021 * 00022 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 00023 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00024 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 00025 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 00026 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 00027 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 00028 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 00029 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 00030 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 00031 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 00032 * SUCH DAMAGE. 00033 * 00034 * @(#) $Header: /cvsroot/nsnam/ns-2/trace/trace.h,v 1.34 2003/08/21 18:22:02 haldar Exp $ 00035 */ 00036 00037 #ifndef ns_trace_h 00038 #define ns_trace_h 00039 00040 #define NUMFLAGS 8 00041 00042 #include <math.h> // floor 00043 #include "packet.h" 00044 #include "basetrace.h" 00045 00046 00047 /* Tracing has evolved into two types, packet tracing and event tracing. 00048 Class Trace essentially supports packet tracing. 00049 However in addition to the basic tracing properties (that it derives from a BaseTrace class), pkt-tracing also requires to inherit some of the Connector class properties as well. 00050 00051 Hence Trace should be renamed as ConnectorTrace in the future. 00052 And it shall have a BaseTrace * variable, where BaseTrace class supporting pure tracing functionalities and should be the parent class for all subsequent trace-related classes. 00053 */ 00054 00055 class Trace : public Connector { 00056 protected: 00057 nsaddr_t src_; 00058 nsaddr_t dst_; 00059 int callback_; 00060 00061 virtual void format(int tt, int s, int d, Packet* p); 00062 void annotate(const char* s); 00063 int show_tcphdr_; // bool flags; backward compat 00064 int show_sctphdr_; // bool flags; backward compat 00065 void callback(); 00066 public: 00067 Trace(int type); 00068 ~Trace(); 00069 00070 BaseTrace *pt_; // support for pkt tracing 00071 00072 int type_; 00073 int command(int argc, const char*const* argv); 00074 static int get_seqno(Packet* p); 00075 void recv(Packet* p, Handler*); 00076 void recvOnly(Packet *p); 00077 00078 //Default rounding is to 6 digits after decimal 00079 //#define PRECISION 1.0E+6 00080 //According to freeBSD /usr/include/float.h 15 is the number of digits 00081 // in a double. We can specify all of them, because we're rounding to 00082 // 6 digits after the decimal and and %g removes trailing zeros. 00083 //#define TIME_FORMAT "%.15g" 00084 // annoying way of tackling sprintf rounding platform 00085 // differences : 00086 // use round(Scheduler::instance().clock()) instead of 00087 // Scheduler::instance().clock(). 00088 //static double round (double x, double precision=PRECISION) { 00089 //return (double)floor(x*precision + 0.5)/precision; 00090 //} 00091 00092 virtual void write_nam_trace(const char *s); 00093 void trace(TracedVar* var); 00094 //void namdump(); 00095 }; 00096 00097 class DequeTrace : public Trace { 00098 public: 00099 DequeTrace(int type) : Trace(type) {} 00100 ~DequeTrace(); 00101 void recv(Packet* p, Handler*); 00102 00103 }; 00104 00105 00106 #endif