00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #ifndef ns_agent_h
00038 #define ns_agent_h
00039
00040 #include "connector.h"
00041 #include "packet.h"
00042 #include "timer-handler.h"
00043 #include "ns-process.h"
00044 #include "app.h"
00045
00046 #define TIME_FORMAT "%.15g"
00047
00048
00049
00050 #define TIMER_IDLE 0
00051 #define TIMER_PENDING 1
00052
00053
00054
00055
00056
00057 #define TRACEVAR_MAXVALUELENGTH 128
00058
00059 class Application;
00060
00061
00062
00063
00064 struct OldValue {
00065 TracedVar *var_;
00066 char val_[TRACEVAR_MAXVALUELENGTH];
00067 struct OldValue *next_;
00068 };
00069
00070 class EventTrace;
00071 class Agent : public Connector {
00072 public:
00073 Agent(packet_t pktType);
00074 virtual ~Agent();
00075 void recv(Packet*, Handler*);
00076
00077
00078 void recvOnly(Packet *) {};
00079
00080 void send(Packet* p, Handler* h) { target_->recv(p, h); }
00081 virtual void timeout(int tno);
00082
00083 virtual void sendmsg(int sz, AppData*, const char* flags = 0);
00084 virtual void send(int sz, AppData *data) { sendmsg(sz, data, 0); }
00085 virtual void sendto(int sz, AppData*, const char* flags,
00086 nsaddr_t dst);
00087 virtual void sendto(int sz, AppData*, const char* flags,
00088 ns_addr_t dst);
00089
00090 virtual void sendmsg(int nbytes, const char *flags = 0);
00091 virtual void send(int nbytes) { sendmsg(nbytes); }
00092 virtual void sendto(int nbytes, const char* flags, nsaddr_t dst);
00093 virtual void sendto(int nbytes, const char* flags, ns_addr_t dst);
00094 virtual void connect(nsaddr_t dst);
00095 virtual void close();
00096 virtual void listen();
00097 virtual void attachApp(Application* app);
00098 virtual int& size() { return size_; }
00099 inline nsaddr_t& addr() { return here_.addr_; }
00100 inline nsaddr_t& port() { return here_.port_; }
00101 inline nsaddr_t& daddr() { return dst_.addr_; }
00102 inline nsaddr_t& dport() { return dst_.port_; }
00103 void set_pkttype(packet_t pkttype) { type_ = pkttype; }
00104 inline packet_t get_pkttype() { return type_; }
00105
00106 protected:
00107 int command(int argc, const char*const* argv);
00108 virtual void delay_bind_init_all();
00109 virtual int delay_bind_dispatch(const char *varName, const char *localName, TclObject *tracer);
00110
00111 virtual void recvBytes(int bytes);
00112 virtual void idle();
00113 Packet* allocpkt() const;
00114 Packet* allocpkt(int) const;
00115 void initpkt(Packet*) const;
00116
00117 ns_addr_t here_;
00118 ns_addr_t dst_;
00119 int size_;
00120 packet_t type_;
00121 int fid_;
00122 int prio_;
00123 int flags_;
00124 int defttl_;
00125
00126 #ifdef notdef
00127 int seqno_;
00128 int class_;
00129 #endif
00130
00131 static int uidcnt_;
00132
00133 Tcl_Channel channel_;
00134 char *traceName_;
00135 OldValue *oldValueList_;
00136
00137 Application *app_;
00138
00139 virtual void trace(TracedVar *v);
00140 void deleteAgentTrace();
00141 void addAgentTrace(const char *name);
00142 void monitorAgentTrace();
00143 OldValue* lookupOldValue(TracedVar *v);
00144 void insertOldValue(TracedVar *v, const char *value);
00145 void dumpTracedVars();
00146
00147
00148 EventTrace *et_;
00149 virtual void trace_event(char *eventtype){}
00150
00151 private:
00152 void flushAVar(TracedVar *v);
00153 };
00154
00155 #endif
00156