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

通讯编程

开发平台:

Visual C++

  1. /* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
  2. /*
  3.  * Copyright (c) 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 Daedalus Research
  17.  * Group at the University of California Berkeley.
  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.  * Contributed by the Daedalus Research Group, UC Berkeley 
  35.  * (http://daedalus.cs.berkeley.edu)
  36.  *
  37.  * @(#) $Header: /cvsroot/nsnam/ns-2/queue/errmodel.h,v 1.50 2005/04/26 18:56:35 haldar Exp $ (UCB)
  38.  */
  39. #ifndef ns_errmodel_h
  40. #define ns_errmodel_h
  41. #include "connector.h"
  42. #include "timer-handler.h"
  43. #include "ranvar.h"
  44. #include "packet.h"
  45. #include "basetrace.h"
  46. enum ErrorUnit { EU_TIME=0, EU_BYTE, EU_PKT, EU_BIT };
  47. #define EU_NAMES "time", "byte", "pkt", "bit"
  48. #define STR2EU(s) (!strcmp(s,"time") ? EU_TIME : (!strcmp(s,"byte") ? EU_BYTE : (!strcmp(s, "bit") ? EU_BIT : EU_PKT)))
  49. enum StTypeUnit {ST_TIME=0, ST_PKT };
  50. #define ST_NAMES "time", "pkt"
  51. #define STR2ST(s) (!strcmp(s,"time") ? ST_TIME : ST_PKT)
  52. #define EM_GOOD 1
  53. #define EM_BAD 2
  54. /* 
  55.  * Basic object for error models.  This can be used unchanged by error 
  56.  * models that are characterized by a single parameter, the rate of errors 
  57.  * (or equivalently, the mean duration/spacing between errors).  Currently,
  58.  * this includes the uniform and exponentially-distributed models.
  59.  */
  60. class ErrorModel : public Connector {
  61. public:
  62. ErrorModel();
  63. virtual void recv(Packet*, Handler*);
  64. virtual void reset();
  65. virtual int corrupt(Packet*);
  66. inline double rate() { return rate_; }
  67. inline ErrorUnit unit() { return unit_; }
  68. protected:
  69. virtual int command(int argc, const char*const* argv);
  70. int CorruptPkt(Packet*);
  71. int CorruptTime(Packet*);
  72. int CorruptByte(Packet*);
  73. int CorruptBit(Packet*);
  74. double PktLength(Packet*);
  75. double * ComputeBitErrProb(int);
  76. // event-tracing
  77. virtual void trace_event(char *eventtype);
  78. EventTrace *et_;
  79. int enable_; // true if this error module is turned on
  80. int markecn_; // mark ecn instead of dropping on corruption?
  81. int delay_pkt_; // delay packet instead of dropping
  82. int firstTime_; // to not corrupt first packet in byte model
  83. ErrorUnit unit_; // error unit in pkts, bytes, or time
  84. double rate_; // uniform error rate in pkt or byte
  85. double delay_; // time to delay packet
  86. double bandwidth_; // bandwidth of the link
  87. RandomVariable *ranvar_;// the underlying random variate generator
  88. int FECstrength_;       // indicate how many corrupted bits are corrected
  89. int datapktsize_;
  90. int cntrlpktsize_;
  91. double *cntrlprb_;
  92. double *dataprb_;
  93. Event intr_; // set callback to queue
  94. };
  95. class TwoStateErrorModel;
  96. /* Timer for Errormodels using time to change states */
  97. class TwoStateErrModelTimer : public TimerHandler {
  98. public:
  99. TwoStateErrModelTimer(TwoStateErrorModel *a, void (TwoStateErrorModel::*call_back)())
  100. : a_(a), call_back_(call_back) {};
  101. protected:
  102. virtual void expire (Event *e);
  103. TwoStateErrorModel *a_;
  104. void (TwoStateErrorModel::*call_back_)();
  105. };
  106. class TwoStateErrorModel : public ErrorModel {
  107. friend class ComplexTwoStateErrorModel;
  108. public:
  109. TwoStateErrorModel();
  110. virtual int corrupt(Packet*);
  111. void setunit(ErrorUnit unit) {unit_ = unit;}
  112. protected:
  113. int command(int argc, const char*const* argv);
  114. virtual int corruptPkt(Packet* p);
  115. virtual int corruptTime(Packet* p);
  116. virtual void checkUnit();
  117. void transitionState();
  118. int state_; // state: 0=error-free, 1=error
  119. double remainLen_; // remaining length of the current state
  120. RandomVariable *ranvar_[2]; // ranvar staying length for each state
  121. TwoStateErrModelTimer*  twoStateTimer_;
  122. };
  123. class ComplexTwoStateErrorModel : public TwoStateErrorModel {
  124. public:
  125. ComplexTwoStateErrorModel();
  126. ~ComplexTwoStateErrorModel();
  127. protected:
  128. int command(int argc, const char*const* argv);
  129. virtual int corruptPkt(Packet* p);
  130. virtual int corruptTime(Packet* p);
  131. TwoStateErrorModel*  em_[2];
  132. };
  133. class MultiStateErrorModel : public ErrorModel {
  134. public:
  135. MultiStateErrorModel();
  136. virtual int corrupt(Packet*);
  137. protected:
  138. int command(int argc, const char*const* argv);
  139. int sttype_;            // type of state trans: 1: 'pkt' prob, 0: 'time'
  140. int texpired_;          // timed-state expired?
  141. double curperiod_;      // the duration of the current state
  142. double prevTime_;       // the last transition time of current state
  143. ErrorModel* em_; // current error model to use
  144. };
  145. /* error model that reads a loss trace (instead of a math/computed model) */
  146. class TraceErrorModel : public ErrorModel {
  147. public:
  148. TraceErrorModel();
  149. virtual int match(Packet* p);
  150. virtual int corrupt(Packet* p);
  151. protected:
  152. double loss_;
  153. double good_;
  154. };
  155. /*
  156.  * periodic packet drops (drop every nth packet we see)
  157.  * this can be conveniently combined with a flow-based classifier
  158.  * to achieve drops in particular flows
  159.  */
  160. class PeriodicErrorModel : public ErrorModel {
  161. public:
  162. PeriodicErrorModel();
  163. virtual int corrupt(Packet*);
  164. protected:
  165. int cnt_;
  166. double period_;
  167. double offset_;
  168. double burstlen_;
  169. double last_time_;
  170. double first_time_;
  171. int default_drop_; // 0 for regular, 1 to drop all
  172. //   but last pkt in period_
  173. };
  174. /*
  175.  * List error model: specify which packets to drop in tcl
  176.  */
  177. class ListErrorModel : public ErrorModel {
  178. public:
  179. ListErrorModel() : cnt_(0), droplist_(NULL),
  180. dropcnt_(0), cur_(0) { }
  181. ~ListErrorModel() { if (droplist_) delete droplist_; }
  182. virtual int corrupt(Packet*);
  183. int command(int argc, const char*const* argv);
  184. protected:
  185. int parse_droplist(int argc, const char *const*);
  186. static int nextval(const char*&p);
  187. static int intcomp(const void*, const void*); // for qsort
  188. int cnt_; /* cnt of pkts/bytes we've seen */
  189. int* droplist_; /* array of pkt/byte #s to affect */
  190. int dropcnt_; /* # entries in droplist_ total */
  191. int cur_; /* current index into droplist_ */
  192. };
  193. /* For Selective packet drop */
  194. class SelectErrorModel : public ErrorModel {
  195. public:
  196. SelectErrorModel();
  197. virtual int corrupt(Packet*);
  198. protected:
  199. int command(int argc, const char*const* argv);
  200. packet_t pkt_type_;
  201. int drop_cycle_;
  202. int drop_offset_;
  203. };
  204. /* error model for multicast routing,... now inherits from trace.. later
  205. may make them separate and use pointer/containment.. etc */
  206. class MrouteErrorModel : public TraceErrorModel {
  207. public:
  208. MrouteErrorModel();
  209. virtual int match(Packet* p);
  210. inline int maxtype() { return sizeof(msg_type); }
  211. protected:
  212. int command(int argc, const char*const* argv);
  213. char msg_type[15]; /* to which to copy the message code (e.g.
  214.     *  "prune","join"). It's size is the same
  215.     * as type_ in prune.h [also returned by maxtype.]
  216.     */
  217. };
  218. class Classifier;
  219. class ErrorModule : public Connector {
  220. public:
  221. ErrorModule() : classifier_(0) {}
  222. protected:
  223. int command(int, const char*const*);
  224. void recv(Packet*, Handler*);
  225. Classifier* classifier_;
  226. };
  227. #ifdef HAVE_STL //pgm code uses STL
  228. // PGM error model
  229. class PGMErrorModel : public ErrorModel {
  230. public:
  231.         PGMErrorModel();
  232.         virtual int corrupt(Packet*);
  233. protected:
  234.         int ndrops_;
  235.         int command(int argc, const char*const* argv);
  236.         int pgm_type_;
  237.         int drop_cycle_;
  238.         int drop_offset_;
  239. int count_;
  240. };
  241. #endif//HAVE_STL
  242. // LMS error model
  243. class LMSErrorModel : public ErrorModel {
  244. public:
  245.         LMSErrorModel();
  246.         virtual int corrupt(Packet*);
  247.  
  248. protected:
  249. int ndrops_;
  250. int command(int argc, const char*const* argv);
  251. packet_t pkt_type_;
  252. int drop_cycle_;
  253. int drop_offset_;
  254. int off_rtp_;
  255. int off_lms_;
  256. };
  257. #endif