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