trace.h
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:8k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * Copyright (c) 1991,1993 Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. All advertising materials mentioning features or use of this software
  14.  *    must display the following acknowledgement:
  15.  * This product includes software developed by the Computer Systems
  16.  * Engineering Group at Lawrence Berkeley Laboratory.
  17.  * 4. Neither the name of the University nor of the Laboratory may be used
  18.  *    to endorse or promote products derived from this software without
  19.  *    specific prior written permission.
  20.  *
  21.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  22.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31.  * SUCH DAMAGE.
  32.  *
  33.  * @(#) $Header: /cvsroot/nsnam/nam-1/trace.h,v 1.38 2003/01/28 03:22:38 buchheim Exp $ (LBL)
  34.  */
  35. #ifndef nam_trace_h
  36. #define nam_trace_h
  37. #include "tclcl.h"
  38. #include "animator.h"
  39. #include "parser.h"
  40. class NamStream;
  41. //class ParseTable;
  42. #define TRACE_LINE_MAXLEN 256
  43. /*
  44.  * 'packet' events (hop, enqueue, dequeue & drop) all have the same
  45.  * format:  the src & dst node and a description of the packet.
  46.  */
  47. #define PTYPELEN 16
  48. #define CONVLEN 32
  49. #define FORWARDS 1
  50. #define BACKWARDS -1
  51. #define TIME_EOF -1
  52. #define TIME_BOF -2
  53. struct PacketAttr {
  54. int size;
  55. int attr;
  56.   int id;
  57. int energy ;
  58. int esrc ;
  59. int edst ;
  60. double wBcastDuration;
  61. double wBcastRadius;
  62. char type[PTYPELEN];
  63. char wtype[PTYPELEN]; //AGT,RTR or MAC
  64. char convid[CONVLEN];
  65. };
  66. struct PacketEvent {
  67. int src;
  68. int dst;
  69. PacketAttr pkt;
  70. PacketAttr namgraph_flags; // for ignoring namgraph flags
  71. };
  72. struct VarEvent {
  73. /* Var event stuff */
  74. int str;
  75. //char * str;
  76. };
  77. /*XXX don't really want these fixed size*/
  78. #define MAXNAME 20
  79. #define MAXVALUE 256
  80. struct AgentAttr {
  81.   char name[MAXNAME];
  82.   int expired;
  83. };
  84.   
  85. struct AgentEvent {
  86.   /*Agent event stuff*/
  87.   int src;
  88.   /*dst is only set if it's an interface agent*/
  89.   int dst;
  90.   AgentAttr agent;
  91. };
  92. struct FeatureAttr {
  93.   char name[MAXNAME];
  94.   char value[MAXVALUE];
  95.   char oldvalue[MAXVALUE];
  96.   char agent[MAXNAME];
  97.   int expired;
  98.   char type;
  99. };
  100. struct FeatureEvent {
  101.   int src;
  102.   /*XXX not sure we need dst here*/
  103.   int dst;
  104.   FeatureAttr feature;
  105. };
  106.   
  107. struct LinkAttr {
  108.   double rate;              // Link Bandwith (Rate)
  109.   double delay;             // Link Delay
  110.   double length;            // length
  111.   double angle;             // orientation
  112.   char state[MAXVALUE];
  113.   char color[MAXNAME];
  114.   char oldColor[MAXNAME];
  115.   char dlabel[MAXNAME];     // label beneath a link
  116.   char odlabel[MAXNAME];    // old dlabel
  117.   char direction[MAXNAME];  // direction of the label 
  118.   char odirection[MAXNAME]; 
  119.   char dcolor[MAXNAME];      // label color
  120.   char odcolor[MAXNAME];
  121. };
  122. struct LinkEvent {
  123.   int src;
  124.   int dst;
  125.   LinkAttr link;
  126. };
  127. struct LanLinkEvent {
  128.   int src;
  129.   int dst;
  130.   double angle;
  131. };
  132. struct LayoutLanEvent {
  133. char name[MAXVALUE];
  134.   double rate;
  135.   double delay;
  136.   double angle;
  137. };
  138. struct NodeMarkAttr {
  139. char name[MAXVALUE];
  140. char shape[MAXNAME];
  141. char color[MAXNAME];
  142. int expired;
  143. };
  144. struct NodeMarkEvent {
  145. int src;
  146. NodeMarkAttr mark;
  147. };
  148. struct NodeAttr {
  149. int addr;
  150.   char state[MAXNAME];
  151.   char dlabel[MAXNAME];      // label beneath a node
  152.   char odlabel[MAXNAME];     // old dlabel
  153.   char color[MAXNAME];
  154.   char oldColor[MAXNAME];
  155.   char direction[MAXNAME];   // direction of the label 
  156.   char odirection[MAXNAME];
  157.   char lcolor[MAXNAME];      // inside label color
  158.   char olcolor[MAXNAME];
  159.   char dcolor[MAXNAME];      // label color
  160.   char odcolor[MAXNAME];
  161. };
  162. struct NodeEvent {
  163.   int src;
  164.   /*dst is only set if it's an interface event*/
  165.   int dst;
  166.   NodeAttr node;
  167.   NodeMarkAttr mark;  // Added for dynamic nodes
  168.   double x;
  169.   double y;
  170.   double z;  // Not fully implemented
  171.   double x_vel_;
  172.   double y_vel_;
  173.   double stoptime;
  174.   double size;
  175.   int wireless;
  176. };
  177. const int GROUP_EVENT_JOIN = 1;
  178. const int GROUP_EVENT_LEAVE = 2;
  179. struct GroupAttr {
  180. char name[MAXNAME];
  181. int flag;  /* 1: join, 2: leave, 3: create new group */
  182. int mbr;
  183. };
  184. struct GroupEvent {
  185. int src; /* group address */
  186. GroupAttr grp;
  187. };
  188. struct RouteAttr {
  189.   int expired;
  190.   int neg;
  191.   double timeout;
  192.   int pktsrc;
  193.   int group;
  194.   char mode[MAXVALUE];
  195. };
  196. struct RouteEvent {
  197.   int src;
  198.   int dst;
  199.   RouteAttr route;
  200. };
  201. struct HierarchicalAddressEvent {
  202.   int hierarchy;
  203.   int portshift;
  204.   char portmask[MAXNAME];
  205.   int multicast_shift;
  206.   int multicast_mask;
  207.   
  208.   int nodeshift;
  209.   int nodemask;
  210. };
  211. struct ColorEvent {
  212.   int id;
  213.   char color[MAXNAME];
  214. };
  215. struct QueueEvent {
  216.   int src;
  217.   int dst;
  218.   double angle;
  219. };
  220. struct WirelessEvent {
  221.   int x;
  222.   int y;
  223. };
  224. struct TrafficSourceEvent {
  225.   int id;
  226.   int agent_id; 
  227. };
  228. struct TraceEvent {
  229.     double time; /* event time */
  230.     long offset; /* XXX trace file offset */
  231.     int lineno;    /* XXX trace file line no. */
  232.     int tt;     /* type: h,+,-,d */
  233.     union {
  234.       PacketEvent pe;
  235.       VarEvent ve;
  236.       AgentEvent ae;
  237.       FeatureEvent fe;
  238.       LinkEvent le;
  239.       LanLinkEvent lle;
  240.       LayoutLanEvent layoutle;
  241.       NodeEvent ne;
  242.       RouteEvent re;
  243.       NodeMarkEvent me;
  244.       GroupEvent ge;
  245.       HierarchicalAddressEvent hae;
  246.       ColorEvent ce;
  247.       QueueEvent qe;
  248.       WirelessEvent we;
  249.     };
  250.     char version[MAXNAME];
  251.     int dummy;  // Used for variables that are discarded
  252.     char dummy_str[MAXNAME];  // Used for variables that are discarded
  253.     bool valid;
  254.     char image[TRACE_LINE_MAXLEN];
  255. };
  256. class TraceHandler : public TclObject {
  257. public:
  258.   TraceHandler() : nam_(0) {}
  259.   TraceHandler(const char *animator) {
  260.     nam_ = (NetworkAnimator *)TclObject::lookup(animator);
  261.   }
  262.   virtual void update(double) = 0;
  263.   virtual void reset(double) = 0;
  264.   virtual void handle(const TraceEvent&, double now, int direction) = 0;
  265.   inline NetworkAnimator* nam() { return nam_; }
  266. protected:
  267.   NetworkAnimator *nam_;
  268. };
  269. struct TraceHandlerList {
  270. TraceHandler* th;
  271. TraceHandlerList* next;
  272. };
  273. class Trace : public TclObject {
  274.  public:
  275. Trace(const char * fname, const char * animator);
  276. ~Trace();
  277. int command(int argc, const char*const* argv);
  278. int ReadEvent(double, TraceEvent&);
  279. void scan();
  280. void rewind(long);
  281. int nextLine();
  282. double nextTime() { return (pending_.time); }
  283. double Maxtime() { return (maxtime_); }
  284. double Mintime() { return (mintime_); }
  285. int valid();
  286. NetworkAnimator* nam() { return nam_; }
  287. Trace* next_;
  288.  private:
  289. void addHandler(TraceHandler*);
  290. void settime(double now, int timeSliderClicked);
  291. void findLastLine();
  292. TraceHandlerList* handlers_;
  293. int lineno_;
  294. double maxtime_;
  295. double mintime_;
  296. double now_;
  297. NamStream *nam_stream_;
  298. int direction_;  //  1 = Forwards, -1 = Backwards
  299. double last_event_time_; // Used for reporting trace syntax timing errors
  300. TraceEvent pending_;
  301. char fileName_[256];
  302. NetworkAnimator * nam_;
  303. int skipahead_mode_; 
  304. int count_;
  305.   
  306. ParseTable * parse_table_;
  307. };
  308. #endif