/*
* Copyright (c) 1991,1993 Regents of the University of California.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the Computer Systems
* Engineering Group at Lawrence Berkeley Laboratory.
* 4. Neither the name of the University nor of the Laboratory may be used
* to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* @(#) $Header: /cvsroot/nsnam/nam-1/trace.h,v 1.38 2003/01/28 03:22:38 buchheim Exp $ (LBL)
*/
#ifndef nam_trace_h
#define nam_trace_h
#include "tclcl.h"
#include "animator.h"
#include "parser.h"
class NamStream;
//class ParseTable;
#define TRACE_LINE_MAXLEN 256
/*
* 'packet' events (hop, enqueue, dequeue & drop) all have the same
* format: the src & dst node and a description of the packet.
*/
#define PTYPELEN 16
#define CONVLEN 32
#define FORWARDS 1
#define BACKWARDS -1
#define TIME_EOF -1
#define TIME_BOF -2
struct PacketAttr {
int size;
int attr;
int id;
int energy ;
int esrc ;
int edst ;
double wBcastDuration;
double wBcastRadius;
char type[PTYPELEN];
char wtype[PTYPELEN]; //AGT,RTR or MAC
char convid[CONVLEN];
};
struct PacketEvent {
int src;
int dst;
PacketAttr pkt;
PacketAttr namgraph_flags; // for ignoring namgraph flags
};
struct VarEvent {
/* Var event stuff */
int str;
//char * str;
};
/*XXX don't really want these fixed size*/
#define MAXNAME 20
#define MAXVALUE 256
struct AgentAttr {
char name[MAXNAME];
int expired;
};
struct AgentEvent {
/*Agent event stuff*/
int src;
/*dst is only set if it's an interface agent*/
int dst;
AgentAttr agent;
};
struct FeatureAttr {
char name[MAXNAME];
char value[MAXVALUE];
char oldvalue[MAXVALUE];
char agent[MAXNAME];
int expired;
char type;
};
struct FeatureEvent {
int src;
/*XXX not sure we need dst here*/
int dst;
FeatureAttr feature;
};
struct LinkAttr {
double rate; // Link Bandwith (Rate)
double delay; // Link Delay
double length; // length
double angle; // orientation
char state[MAXVALUE];
char color[MAXNAME];
char oldColor[MAXNAME];
char dlabel[MAXNAME]; // label beneath a link
char odlabel[MAXNAME]; // old dlabel
char direction[MAXNAME]; // direction of the label
char odirection[MAXNAME];
char dcolor[MAXNAME]; // label color
char odcolor[MAXNAME];
};
struct LinkEvent {
int src;
int dst;
LinkAttr link;
};
struct LanLinkEvent {
int src;
int dst;
double angle;
};
struct LayoutLanEvent {
char name[MAXVALUE];
double rate;
double delay;
double angle;
};
struct NodeMarkAttr {
char name[MAXVALUE];
char shape[MAXNAME];
char color[MAXNAME];
int expired;
};
struct NodeMarkEvent {
int src;
NodeMarkAttr mark;
};
struct NodeAttr {
int addr;
char state[MAXNAME];
char dlabel[MAXNAME]; // label beneath a node
char odlabel[MAXNAME]; // old dlabel
char color[MAXNAME];
char oldColor[MAXNAME];
char direction[MAXNAME]; // direction of the label
char odirection[MAXNAME];
char lcolor[MAXNAME]; // inside label color
char olcolor[MAXNAME];
char dcolor[MAXNAME]; // label color
char odcolor[MAXNAME];
};
struct NodeEvent {
int src;
/*dst is only set if it's an interface event*/
int dst;
NodeAttr node;
NodeMarkAttr mark; // Added for dynamic nodes
double x;
double y;
double z; // Not fully implemented
double x_vel_;
double y_vel_;
double stoptime;
double size;
int wireless;
};
const int GROUP_EVENT_JOIN = 1;
const int GROUP_EVENT_LEAVE = 2;
struct GroupAttr {
char name[MAXNAME];
int flag; /* 1: join, 2: leave, 3: create new group */
int mbr;
};
struct GroupEvent {
int src; /* group address */
GroupAttr grp;
};
struct RouteAttr {
int expired;
int neg;
double timeout;
int pktsrc;
int group;
char mode[MAXVALUE];
};
struct RouteEvent {
int src;
int dst;
RouteAttr route;
};
struct HierarchicalAddressEvent {
int hierarchy;
int portshift;
char portmask[MAXNAME];
int multicast_shift;
int multicast_mask;
int nodeshift;
int nodemask;
};
struct ColorEvent {
int id;
char color[MAXNAME];
};
struct QueueEvent {
int src;
int dst;
double angle;
};
struct WirelessEvent {
int x;
int y;
};
struct TrafficSourceEvent {
int id;
int agent_id;
};
struct TraceEvent {
double time; /* event time */
long offset; /* XXX trace file offset */
int lineno; /* XXX trace file line no. */
int tt; /* type: h,+,-,d */
union {
PacketEvent pe;
VarEvent ve;
AgentEvent ae;
FeatureEvent fe;
LinkEvent le;
LanLinkEvent lle;
LayoutLanEvent layoutle;
NodeEvent ne;
RouteEvent re;
NodeMarkEvent me;
GroupEvent ge;
HierarchicalAddressEvent hae;
ColorEvent ce;
QueueEvent qe;
WirelessEvent we;
};
char version[MAXNAME];
int dummy; // Used for variables that are discarded
char dummy_str[MAXNAME]; // Used for variables that are discarded
bool valid;
char image[TRACE_LINE_MAXLEN];
};
class TraceHandler : public TclObject {
public:
TraceHandler() : nam_(0) {}
TraceHandler(const char *animator) {
nam_ = (NetworkAnimator *)TclObject::lookup(animator);
}
virtual void update(double) = 0;
virtual void reset(double) = 0;
virtual void handle(const TraceEvent&, double now, int direction) = 0;
inline NetworkAnimator* nam() { return nam_; }
protected:
NetworkAnimator *nam_;
};
struct TraceHandlerList {
TraceHandler* th;
TraceHandlerList* next;
};
class Trace : public TclObject {
public:
Trace(const char * fname, const char * animator);
~Trace();
int command(int argc, const char*const* argv);
int ReadEvent(double, TraceEvent&);
void scan();
void rewind(long);
int nextLine();
double nextTime() { return (pending_.time); }
double Maxtime() { return (maxtime_); }
double Mintime() { return (mintime_); }
int valid();
NetworkAnimator* nam() { return nam_; }
Trace* next_;
private:
void addHandler(TraceHandler*);
void settime(double now, int timeSliderClicked);
void findLastLine();
TraceHandlerList* handlers_;
int lineno_;
double maxtime_;
double mintime_;
double now_;
NamStream *nam_stream_;
int direction_; // 1 = Forwards, -1 = Backwards
double last_event_time_; // Used for reporting trace syntax timing errors
TraceEvent pending_;
char fileName_[256];
NetworkAnimator * nam_;
int skipahead_mode_;
int count_;
ParseTable * parse_table_;
};
#endif
syntax highlighted by Code2HTML, v. 0.9.1