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

通讯编程

开发平台:

Visual C++

  1. /* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
  2. /*
  3.  * Copyright(c) 1991-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.  */
  35. #include "agent.h"
  36. #include "packet.h"
  37. #include "ip.h"
  38. #include "timer-handler.h"
  39. #include "random.h"
  40. #include "tfrc.h"
  41. #define LARGE_DOUBLE 9999999999.99 
  42. #define SAMLLFLOAT 0.0000001
  43. /* packet status */
  44. #define UNKNOWN 0
  45. #define RCVD 1
  46. #define LOST 2 // Lost, and beginning of a new loss event
  47. #define NOT_RCVD 3 // Lost, but not the beginning of a new loss event
  48. #define ECNLOST 4 // ECN, and beginning of a new loss event
  49. #define ECN_RCVD 5 // Received with ECN. 
  50. #define DEFAULT_NUMSAMPLES  8
  51. #define WALI 1
  52. #define EWMA 2 
  53. #define RBPH 3
  54. #define EBPH 4 
  55. class TfrcSinkAgent;
  56. class TfrcNackTimer : public TimerHandler {
  57. public:
  58. TfrcNackTimer(TfrcSinkAgent *a) : TimerHandler() { 
  59. a_ = a; 
  60. }
  61. virtual void expire(Event *e);
  62. protected:
  63. TfrcSinkAgent *a_;
  64. };
  65. class TfrcSinkAgent : public Agent {
  66. friend class TfrcNackTimer;
  67. public:
  68. TfrcSinkAgent();
  69. void recv(Packet*, Handler*);
  70. protected:
  71. void sendpkt(double);
  72. void nextpkt(double);
  73. double adjust_history(double);
  74. double est_loss();
  75. double est_thput(); 
  76. int command(int argc, const char*const* argv);
  77. void print_loss(int sample, double ave_interval);
  78. void print_loss_all(int *sample);
  79. void print_losses_all(int *losses);
  80. void print_count_losses_all(int *count_losses);
  81. void print_num_rtts_all(int *num_rtts);
  82. int new_loss(int i, double tstamp);
  83. double estimate_tstamp(int before, int after, int i);
  84. // algo specific
  85. double est_loss_WALI();
  86. void shift_array(int *a, int sz, int defval) ;
  87. void shift_array(double *a, int sz, double defval) ;
  88. void multiply_array(double *a, int sz, double multiplier);
  89. void init_WALI();
  90. double weighted_average(int start, int end, double factor, double *m, double *w, int *sample);
  91. int get_sample(int oldSample, int numLosses);
  92. int get_sample_rtts(int oldSample, int numLosses, int rtts);
  93. double weighted_average1(int start, int end, double factor, double *m, double *w, int *sample, int ShortIntervals, int *losses, int *count_losses, int *num_rtts);
  94. double est_loss_EWMA () ;
  95. double est_loss_RBPH () ;
  96. double est_loss_EBPH() ;
  97. //comman variables
  98. TfrcNackTimer nack_timer_;
  99. int psize_; // size of received packet
  100. int fsize_; // size of large TCP packet, for VoIP mode.
  101. double rtt_; // rtt value reported by sender
  102. double tzero_; // timeout value reported by sender
  103. int smooth_; // for the smoother method for incorporating
  104. //  incorporating new loss intervals
  105. int total_received_; // total # of pkts rcvd by rcvr, 
  106. //   for statistics only
  107. int total_losses_;      // total # of losses, for statistics only
  108. int total_dropped_; // total # of drops, for statistics
  109. int bval_; // value of B used in the formula
  110. double last_report_sent;  // when was last feedback sent
  111. double NumFeedback_;  // how many feedbacks per rtt
  112. int rcvd_since_last_report;  // # of packets rcvd since last report
  113. int losses_since_last_report; // # of losses since last report
  114. int printLoss_; // to print estimated loss rates
  115. int maxseq;  // max seq number seen
  116. int maxseqList;         // max seq number checked for dropped packets
  117. int numPkts_; // Num non-sequential packets before
  118. //  inferring loss
  119.         double minDiscountRatio_;  // Minimum for history discounting.
  120. int numPktsSoFar_; // Num non-sequential packets so far
  121. int PreciseLoss_;       // to estimate loss events more precisely
  122. // an option for single-RTT loss intervals
  123. int ShortIntervals_ ; // For calculating loss event rates for short 
  124. //  loss intervals:  "0" for counting a
  125. // single loss; "1" for counting the actual
  126. // number of losses; "2" for counting at
  127. // most a large packet of losses (not done);
  128. // "3" for decreasing fraction of losses
  129.                                 // counted for longer loss intervals;
  130.                                 // >10 for old methods that don't ignore the
  131.                                 // current short loss interval. 
  132.         int ShortRtts_ ; // Max num of RTTs in a short interval.
  133. // these assist in keep track of incoming packets and calculate flost_
  134. double last_timestamp_; // timestamp of last new, in-order pkt arrival.
  135. double last_arrival_;   // time of last new, in-order pkt arrival.
  136. int hsz; // InitHistorySize_, number of pkts in history
  137. char *lossvec_; // array with packet history
  138. double *rtvec_; // array with time of packet arrival
  139. double *tsvec_; // array with timestamp of packet
  140. int lastloss_round_id ; // round_id for start of loss event
  141. int round_id ; // round_id of last new, in-order packet
  142. double lastloss;  // when last loss occured
  143. // WALI specific
  144. int numsamples ;
  145. int *sample; // array with size of loss interval
  146. double *weights ; // weight for loss interval
  147. double *mult ; // discount factor for loss interval
  148. int *losses ; // array with number of losses per loss
  149. //   interval
  150. int *count_losses ; // "1" to count losses in the loss interval
  151.         int *num_rtts ;         // number of rtts per loss interval
  152. double mult_factor_; // most recent multiple of mult array
  153. int sample_count ; // number of loss intervals
  154. int last_sample ;   // loss event rate estimated to here
  155. int init_WALI_flag; // sample arrays initialized
  156. // these are for "faking" history after slow start
  157. int loss_seen_yet;  // have we seen the first loss yet?
  158. int adjust_history_after_ss; // fake history after slow start? (0/1)
  159. int false_sample;  // by how much?
  160. int algo; // algo for loss estimation 
  161. int discount ; // emphasize most recent loss interval
  162. //  when it is very large
  163. int bytes_ ; // For reporting on received bytes.
  164. // EWMA: optional variants
  165. double history ;
  166. double avg_loss_int ; 
  167. int loss_int ; 
  168. // RBPH, EBPH: optional variants 
  169. double sendrate ;
  170. int minlc ; 
  171. };