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
00088 virtual void sendmsg(int nbytes, const char *flags = 0);
00089 virtual void send(int nbytes) { sendmsg(nbytes); }
00090 virtual void sendto(int nbytes, const char* flags, nsaddr_t dst);
00091 virtual void connect(nsaddr_t dst);
00092 virtual void close();
00093 virtual void listen();
00094 virtual void attachApp(Application* app);
00095 virtual int& size() { return size_; }
00096 inline nsaddr_t& addr() { return here_.addr_; }
00097 inline nsaddr_t& port() { return here_.port_; }
00098 inline nsaddr_t& daddr() { return dst_.addr_; }
00099 inline nsaddr_t& dport() { return dst_.port_; }
00100 void set_pkttype(packet_t pkttype) { type_ = pkttype; }
00101 inline packet_t get_pkttype() { return type_; }
00102
00103 protected:
00104 int command(int argc, const char*const* argv);
00105 virtual void delay_bind_init_all();
00106 virtual int delay_bind_dispatch(const char *varName, const char *localName, TclObject *tracer);
00107
00108 virtual void recvBytes(int bytes);
00109 virtual void idle();
00110 Packet* allocpkt() const;
00111 Packet* allocpkt(int) const;
00112 void initpkt(Packet*) const;
00113
00114 ns_addr_t here_;
00115 ns_addr_t dst_;
00116 int size_;
00117 packet_t type_;
00118 int fid_;
00119 int prio_;
00120 int flags_;
00121 int defttl_;
00122
00123 #ifdef notdef
00124 int seqno_;
00125 int class_;
00126 #endif
00127
00128 static int uidcnt_;
00129
00130 Tcl_Channel channel_;
00131 char *traceName_;
00132 OldValue *oldValueList_;
00133
00134 Application *app_;
00135
00136 virtual void trace(TracedVar *v);
00137 void deleteAgentTrace();
00138 void addAgentTrace(const char *name);
00139 void monitorAgentTrace();
00140 OldValue* lookupOldValue(TracedVar *v);
00141 void insertOldValue(TracedVar *v, const char *value);
00142 void dumpTracedVars();
00143
00144
00145 EventTrace *et_;
00146 virtual void trace_event(char *eventtype){}
00147
00148 private:
00149 void flushAVar(TracedVar *v);
00150 };
00151
00152 #endif
00153