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

通讯编程

开发平台:

Visual C++

  1. /* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
  2. /*
  3.  * Copyright (c) 1993-1997 Regents of the University of California.
  4.  * All rights reserved.
  5.  *
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  * 1. Redistributions of source code must retain the above copyright
  10.  *    notice, this list of conditions and the following disclaimer.
  11.  * 2. Redistributions in binary form must reproduce the above copyright
  12.  *    notice, this list of conditions and the following disclaimer in the
  13.  *    documentation and/or other materials provided with the distribution.
  14.  * 3. All advertising materials mentioning features or use of this software
  15.  *    must display the following acknowledgement:
  16.  * This product includes software developed by the Computer Systems
  17.  * Engineering Group at Lawrence Berkeley Laboratory.
  18.  * 4. Neither the name of the University nor of the Laboratory may be used
  19.  *    to endorse or promote products derived from this software without
  20.  *    specific prior written permission.
  21.  *
  22.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  23.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  24.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  25.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  26.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  27.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  28.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  29.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  30.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  31.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  32.  * SUCH DAMAGE.
  33.  *
  34.  * @(#) $Header: /cvsroot/nsnam/ns-2/common/agent.h,v 1.36 2003/10/05 06:20:30 xuanc Exp $ (LBL)
  35.  */
  36. #ifndef ns_agent_h
  37. #define ns_agent_h
  38. #include "connector.h"
  39. #include "packet.h"
  40. #include "timer-handler.h"
  41. #include "ns-process.h"
  42. #include "app.h"
  43. //#include "basetrace.h"
  44. #define TIME_FORMAT "%.15g"
  45. // TIME_FORMAT is in basetrace.h, but including that header leads to problems
  46. #define TIMER_IDLE 0
  47. #define TIMER_PENDING 1
  48. /* 
  49.  * Note that timers are now implemented using timer-handler.{cc,h}
  50.  */
  51. #define TRACEVAR_MAXVALUELENGTH 128
  52. class Application;
  53. // store old value of traced vars
  54. // work only for TracedVarTcl
  55. struct OldValue {
  56. TracedVar *var_;
  57. char val_[TRACEVAR_MAXVALUELENGTH];
  58. struct OldValue *next_;
  59. };
  60. class EventTrace;
  61. class Agent : public Connector {
  62.  public:
  63. Agent(packet_t pktType);
  64. virtual ~Agent();
  65. void recv(Packet*, Handler*);
  66. //added for edrop tracing - ratul
  67. void recvOnly(Packet *) {};
  68. void send(Packet* p, Handler* h) { target_->recv(p, h); }
  69. virtual void timeout(int tno);
  70. virtual void sendmsg(int sz, AppData*, const char* flags = 0);
  71. virtual void send(int sz, AppData *data) { sendmsg(sz, data, 0); }
  72. virtual void sendto(int sz, AppData*, const char* flags,
  73.     nsaddr_t dst);
  74. virtual void sendto(int sz, AppData*, const char* flags,
  75.     ns_addr_t dst);
  76. virtual void sendmsg(int nbytes, const char *flags = 0);
  77. virtual void send(int nbytes) { sendmsg(nbytes); }
  78. virtual void sendto(int nbytes, const char* flags, nsaddr_t dst);
  79. virtual void sendto(int nbytes, const char* flags, ns_addr_t dst);
  80. virtual void connect(nsaddr_t dst);
  81. virtual void close();
  82. virtual void listen();
  83. virtual void attachApp(Application* app);
  84. virtual int& size() { return size_; }
  85. inline nsaddr_t& addr() { return here_.addr_; }
  86. inline nsaddr_t& port() { return here_.port_; }
  87. inline nsaddr_t& daddr() { return dst_.addr_; }
  88. inline nsaddr_t& dport() { return dst_.port_; }
  89. void set_pkttype(packet_t pkttype) { type_ = pkttype; }
  90. inline packet_t get_pkttype() { return type_; }
  91.  protected:
  92. int command(int argc, const char*const* argv);
  93. virtual void delay_bind_init_all();
  94. virtual int delay_bind_dispatch(const char *varName, const char *localName, TclObject *tracer);
  95. virtual void recvBytes(int bytes);
  96. virtual void idle();
  97. Packet* allocpkt() const; // alloc + set up new pkt
  98. Packet* allocpkt(int) const; // same, but w/data buffer
  99. void initpkt(Packet*) const; // set up fields in a pkt
  100. ns_addr_t here_; // address of this agent
  101. ns_addr_t dst_; // destination address for pkt flow
  102. int size_; // fixed packet size
  103. packet_t type_; // type to place in packet header
  104. int fid_; // for IPv6 flow id field
  105. int prio_; // for IPv6 prio field
  106. int flags_; // for experiments (see ip.h)
  107. int defttl_; // default ttl for outgoing pkts
  108. #ifdef notdef
  109. int seqno_; /* current seqno */
  110. int class_; /* class to place in packet header */
  111. #endif
  112. static int uidcnt_;
  113. Tcl_Channel channel_;
  114. char *traceName_; // name used in agent traces
  115. OldValue *oldValueList_; 
  116. Application *app_; // ptr to application for callback
  117. virtual void trace(TracedVar *v);
  118. void deleteAgentTrace();
  119. void addAgentTrace(const char *name);
  120. void monitorAgentTrace();
  121. OldValue* lookupOldValue(TracedVar *v);
  122. void insertOldValue(TracedVar *v, const char *value);
  123. void dumpTracedVars();
  124. /* support for event-tracing */
  125.         EventTrace *et_;
  126.         virtual void trace_event(char *eventtype){}
  127.  private:
  128. void flushAVar(TracedVar *v);
  129. };
  130. #endif