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

通讯编程

开发平台:

Visual C++

  1. /* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
  2. /* 
  3.  * Copyright 2002, The University of North Carolina at Chapel Hill
  4.  * 
  5.  * Redistribution and use in source and binary forms, with or without 
  6.  * modification, are permitted provided that the following conditions are met:
  7.  * 
  8.  *    1. Redistributions of source code must retain the above copyright 
  9.  * notice, this list of conditions and the following disclaimer.
  10.  *    2. Redistributions in binary form must reproduce the above copyright 
  11.  * notice, this list of conditions and the following disclaimer in the 
  12.  * documentation and/or other materials provided with the distribution.
  13.  *    3. The name of the author may not be used to endorse or promote 
  14.  * products derived from this software without specific prior written 
  15.  * permission.
  16.  * 
  17.  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 
  18.  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
  19.  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
  20.  * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, 
  21.  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
  22.  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
  23.  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
  24.  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 
  25.  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 
  26.  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
  27.  * POSSIBILITY OF SUCH DAMAGE.
  28.  */
  29. /*
  30.  * Reference
  31.  *     Stochastic Models for Generating Synthetic HTTP Source Traffic 
  32.  *     J. Cao, W.S. Cleveland, Y. Gao, K. Jeffay, F.D. Smith, and M.C. Weigle 
  33.  *     IEEE INFOCOM 2004.
  34.  *
  35.  * Documentation available at http://dirt.cs.unc.edu/delaybox/
  36.  * 
  37.  * Contacts: Michele Weigle (mcweigle@cs.unc.edu),
  38.  *           Kevin Jeffay (jeffay@cs.unc.edu)
  39.  */
  40. #include "classifier.h"
  41. #include "node.h"
  42. #include "ranvar.h"
  43. #include <map>
  44. class DelayBoxClassifier;
  45. void packet_string (char* str, hdr_tcp* tcph, hdr_ip* iph, int size);
  46. /*::::::::::::::::: DELAYBOX PAIR ::::::::::::::::::::::::::::::::*/
  47. class DelayBoxPair {
  48. public:
  49. DelayBoxPair() {};
  50. DelayBoxPair(int s, int d, int f=0) : src_(s), dst_(d), fid_(f) {};
  51. DelayBoxPair(const DelayBoxPair&);
  52. bool operator< (const DelayBoxPair&) const;
  53. bool operator==(const DelayBoxPair&) const;
  54. const DelayBoxPair& operator=(const DelayBoxPair&);
  55. void format (char*) const;
  56. void format_short (char*) const;
  57. protected:
  58. int src_;
  59. int dst_;
  60. int fid_;
  61. };
  62. /*::::::::::::::::: DELAYBOX TIMER ::::::::::::::::::::::::::::::::*/
  63. class DelayBoxTimer : public TimerHandler {
  64. public:
  65. DelayBoxTimer(DelayBoxClassifier *a, int src, int dst, int fid) 
  66. : TimerHandler(), a_(a), src_(src), dst_(dst), fid_(fid) {};
  67.   
  68. protected:
  69. virtual void expire(Event *);
  70. DelayBoxClassifier *a_;
  71. int src_;
  72. int dst_;
  73. int fid_;
  74. };
  75. /*::::::::::::::::: DELAYBOX QUEUE ::::::::::::::::::::::::::::::::*/
  76. class DelayBoxQueue {
  77. struct pktinfo {
  78. pktinfo* next_;  // forward link
  79. Packet* pkt_;    // packet
  80. double delta_;   // delta from last pkt
  81. };
  82. public:
  83. DelayBoxQueue() : head_(NULL), tail_(NULL), deltasum_(0) {}
  84. ~DelayBoxQueue();
  85. int empty() { return (head_ == NULL); }
  86. double add(Packet*, double, double);
  87. Packet* dequeue(double*);
  88. void clear();
  89. int oneitem() { return (head_->next_ == NULL); }
  90. void dumplist();        // for debugging
  91. protected:
  92. pktinfo* head_;         // head of linked list
  93. pktinfo* tail_;         // tail of linked list
  94. double deltasum_;       // sum of deltas in queue
  95. };
  96. /*::::::::::::::::: DELAYBOX RULE ::::::::::::::::::::::::::::::::*/
  97. class DelayBoxRule {
  98. friend struct DelayBoxClassifier;
  99. public:
  100. DelayBoxRule(RandomVariable* delay, RandomVariable* loss, 
  101.      RandomVariable* linkspd) : delay_(delay), loss_(loss),
  102. linkspd_(linkspd) {};
  103. DelayBoxRule(RandomVariable* delay, RandomVariable* loss) : 
  104. delay_(delay), loss_(loss), linkspd_(NULL) {};
  105. DelayBoxRule(RandomVariable* delay) : 
  106. delay_(delay), loss_(NULL), linkspd_(NULL) {};
  107. protected:
  108. RandomVariable* delay_;
  109. RandomVariable* loss_;
  110. RandomVariable* linkspd_;
  111. };
  112. /*::::::::::::::::: DELAYBOX FLOW ::::::::::::::::::::::::::::::::*/
  113. class DelayBoxFlow {
  114. friend struct DelayBoxClassifier;
  115. public:
  116. DelayBoxFlow(double delay, double loss, double linkspd, 
  117.      DelayBoxQueue* q, DelayBoxTimer* timer) : delay_(delay), 
  118. loss_(loss), linkspd_(linkspd), queue_(q), timer_(timer) {};
  119. DelayBoxFlow(const DelayBoxFlow& f);
  120. void format (char*);
  121. void format_delay (char*);
  122. protected:
  123. double delay_;
  124. double loss_;
  125. double linkspd_;
  126. DelayBoxQueue* queue_;
  127. DelayBoxTimer* timer_;
  128. };
  129. /*::::::::::::::::: DELAYBOX CLASSIFIER ::::::::::::::::::::::::::::::::*/
  130. class DelayBoxClassifier : public Classifier {
  131. public:
  132. DelayBoxClassifier() : Classifier(), debug_(0), rttfp_(NULL),
  133.        symmetric_(1) {};
  134. ~DelayBoxClassifier();
  135. inline double now() {return Scheduler::instance().clock();}
  136. void timeout(int src, int dst, int fid);
  137. void add_rule (const char*const src, const char*const dst, 
  138.        const char*const dly, const char*const loss, 
  139.        const char*const linkspd);
  140. void add_rule (const char*const src, const char*const dst, 
  141.        const char*const dly, const char*const loss);
  142. void add_rule (const char*const src, const char*const dst, 
  143.        const char*const dly);
  144. void list_rules();
  145. void list_flows();
  146. void output_delay(int src, int dst, int fid, FILE* fp);
  147. inline void set_debug (int d) { debug_ = d; }
  148. inline void set_asymmetric(void) { symmetric_ = 0; }
  149. void setfp (FILE* fp) {rttfp_ = fp;}
  150. protected:
  151. int classify (Packet *p);
  152. void forward_packet (Packet *p);
  153. virtual void recv(Packet *p, Handler *h);
  154. map<DelayBoxPair, DelayBoxRule*> rules_;
  155. map<DelayBoxPair, DelayBoxFlow*> flows_;
  156. int debug_;
  157. FILE* rttfp_;
  158. int symmetric_;   // use symmetric delay (same on data/ACK path)
  159. };
  160. /*::::::::::::::::: DELAYBOX NODE :::::::::::::::::::::::::::::::::::::*/
  161. class DelayBoxNode : public Node {
  162. public:
  163. DelayBoxNode();
  164. ~DelayBoxNode();
  165. int command(int argc, const char*const* argv);
  166. protected:
  167. DelayBoxClassifier* classifier_;
  168. FILE* rttfp_;
  169. };