tcp-fs.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 (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, U.C.Berkeley
  35.  * http://daedalus.cs.berkeley.edu
  36.  */
  37. #ifndef ns_tcp_fs_h
  38. #define ns_tcp_fs_h
  39. #include "tcp.h"
  40. #include "ip.h"
  41. #include "flags.h"
  42. #include "random.h"
  43. #include "template.h"
  44. #include "tcp-fack.h"
  45. class ResetTimer : public TimerHandler {
  46. public: 
  47. ResetTimer(TcpAgent *a) : TimerHandler() { a_ = a; }
  48. protected:
  49. virtual void expire(Event *e);
  50. TcpAgent *a_;
  51. };
  52. /* TCP-FS with Tahoe */
  53. class TcpFsAgent : public virtual TcpAgent {
  54. public:
  55. TcpFsAgent() : t_exact_srtt_(0), t_exact_rttvar_(0), last_recv_time_(0), 
  56. fs_startseq_(0), fs_endseq_(0), fs_mode_(0), count_bytes_acked_(0),
  57. reset_timer_(this) 
  58. {
  59. bind_bool("fast_loss_recov_", &fast_loss_recov_);
  60. bind_bool("fast_reset_timer_", &fast_reset_timer_);
  61. bind_bool("count_bytes_acked_", &count_bytes_acked_);
  62. bind_bool("fs_enable_", &fs_enable_);
  63. }
  64. /* helper functions */
  65. virtual void output_helper(Packet* pkt);
  66. virtual void recv_helper(Packet* pkt);
  67. virtual void send_helper(int maxburst);
  68. virtual void send_idle_helper();
  69. virtual void recv_newack_helper(Packet* pkt);
  70. virtual void partialnewack_helper(Packet*) {};
  71. virtual void set_rtx_timer();
  72. virtual void cancel_rtx_timer();
  73. virtual void cancel_timers();
  74. virtual void timeout_nonrtx(int tno);
  75. virtual void timeout_nonrtx_helper(int tno);
  76. double rtt_exact_timeout() { return (t_exact_srtt_ + 4*t_exact_rttvar_);}
  77. protected:
  78. double t_exact_srtt_;
  79. double t_exact_rttvar_;
  80. double last_recv_time_;
  81. int fs_startseq_;
  82. int fs_endseq_;
  83. int fs_mode_;
  84. int fs_enable_;
  85. int fast_loss_recov_;
  86. int fast_reset_timer_;
  87. int count_bytes_acked_;
  88. ResetTimer reset_timer_;
  89. };
  90. /* TCP-FS with Reno */
  91. class RenoTcpFsAgent : public RenoTcpAgent, public TcpFsAgent {
  92. public:
  93. RenoTcpFsAgent() : RenoTcpAgent(), TcpFsAgent() {}
  94. /* helper functions */
  95. virtual void output_helper(Packet* pkt) {TcpFsAgent::output_helper(pkt);}
  96. virtual void recv_helper(Packet* pkt) {TcpFsAgent::recv_helper(pkt);}
  97. virtual void send_helper(int maxburst) {TcpFsAgent::send_helper(maxburst);}
  98. virtual void send_idle_helper() {TcpFsAgent::send_idle_helper();}
  99. virtual void recv_newack_helper(Packet* pkt) {TcpFsAgent::recv_newack_helper(pkt);}
  100. virtual void set_rtx_timer() {TcpFsAgent::set_rtx_timer();}
  101. virtual void cancel_rtx_timer() {TcpFsAgent::cancel_rtx_timer();}
  102. virtual void cancel_timers(){TcpFsAgent::cancel_timers();}
  103. virtual void timeout_nonrtx(int tno) {TcpFsAgent::timeout_nonrtx(tno);}
  104. virtual void timeout_nonrtx_helper(int tno);
  105. };
  106. /* TCP-FS with NewReno */
  107. class NewRenoTcpFsAgent : public virtual NewRenoTcpAgent, public TcpFsAgent {
  108. public:
  109. NewRenoTcpFsAgent() : NewRenoTcpAgent(), TcpFsAgent() {}
  110. /* helper functions */
  111. virtual void output_helper(Packet* pkt) {TcpFsAgent::output_helper(pkt);}
  112. virtual void recv_helper(Packet* pkt) {TcpFsAgent::recv_helper(pkt);}
  113. virtual void send_helper(int maxburst) {TcpFsAgent::send_helper(maxburst);}
  114. virtual void send_idle_helper() {TcpFsAgent::send_idle_helper();}
  115. virtual void recv_newack_helper(Packet* pkt) {TcpFsAgent::recv_newack_helper(pkt);}
  116. virtual void partialnewack_helper(Packet* pkt);
  117. virtual void set_rtx_timer() {TcpFsAgent::set_rtx_timer();}
  118. virtual void cancel_rtx_timer() {TcpFsAgent::cancel_rtx_timer();}
  119. virtual void cancel_timers(){TcpFsAgent::cancel_timers();}
  120. virtual void timeout_nonrtx(int tno) {TcpFsAgent::timeout_nonrtx(tno);}
  121. virtual void timeout_nonrtx_helper(int tno);
  122. };
  123. #ifdef USE_FACK
  124. /* TCP-FS with Fack */
  125. class FackTcpFsAgent : public FackTcpAgent, public TcpFsAgent {
  126. public:
  127. FackTcpFsAgent() : FackTcpAgent(), TcpFsAgent() {}
  128. /* helper functions */
  129. virtual void output_helper(Packet* pkt) {TcpFsAgent::output_helper(pkt);}
  130. virtual void recv_helper(Packet* pkt) {TcpFsAgent::recv_helper(pkt);}
  131. virtual void send_helper(int maxburst);
  132. virtual void send_idle_helper() {TcpFsAgent::send_idle_helper();}
  133. virtual void recv_newack_helper(Packet* pkt) {TcpFsAgent::recv_newack_helper(pkt);}
  134. virtual void set_rtx_timer() {TcpFsAgent::set_rtx_timer();}
  135. virtual void cancel_rtx_timer() {TcpFsAgent::cancel_rtx_timer();}
  136. virtual void cancel_timers(){TcpFsAgent::cancel_timers();}
  137. virtual void timeout_nonrtx(int tno) {TcpFsAgent::timeout_nonrtx(tno);}
  138. virtual void timeout_nonrtx_helper(int tno);
  139. };
  140. #endif
  141. #endif