00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #ifndef ns_tcp_fs_h
00039 #define ns_tcp_fs_h
00040
00041 #include "tcp.h"
00042 #include "ip.h"
00043 #include "flags.h"
00044 #include "random.h"
00045 #include "template.h"
00046 #include "tcp-fack.h"
00047
00048 class ResetTimer : public TimerHandler {
00049 public:
00050 ResetTimer(TcpAgent *a) : TimerHandler() { a_ = a; }
00051 protected:
00052 virtual void expire(Event *e);
00053 TcpAgent *a_;
00054 };
00055
00056
00057 class TcpFsAgent : public virtual TcpAgent {
00058 public:
00059 TcpFsAgent() : t_exact_srtt_(0), t_exact_rttvar_(0), last_recv_time_(0),
00060 fs_startseq_(0), fs_endseq_(0), fs_mode_(0), count_bytes_acked_(0),
00061 reset_timer_(this)
00062 {
00063 bind_bool("fast_loss_recov_", &fast_loss_recov_);
00064 bind_bool("fast_reset_timer_", &fast_reset_timer_);
00065 bind_bool("count_bytes_acked_", &count_bytes_acked_);
00066 bind_bool("fs_enable_", &fs_enable_);
00067 }
00068
00069
00070 virtual void output_helper(Packet* pkt);
00071 virtual void recv_helper(Packet* pkt);
00072 virtual void send_helper(int maxburst);
00073 virtual void send_idle_helper();
00074 virtual void recv_newack_helper(Packet* pkt);
00075 virtual void partialnewack_helper(Packet*) {};
00076
00077 virtual void set_rtx_timer();
00078 virtual void cancel_rtx_timer();
00079 virtual void cancel_timers();
00080 virtual void timeout_nonrtx(int tno);
00081 virtual void timeout_nonrtx_helper(int tno);
00082 double rtt_exact_timeout() { return (t_exact_srtt_ + 4*t_exact_rttvar_);}
00083 protected:
00084 double t_exact_srtt_;
00085 double t_exact_rttvar_;
00086 double last_recv_time_;
00087 int fs_startseq_;
00088 int fs_endseq_;
00089 int fs_mode_;
00090 int fs_enable_;
00091 int fast_loss_recov_;
00092 int fast_reset_timer_;
00093 int count_bytes_acked_;
00094 ResetTimer reset_timer_;
00095 };
00096
00097
00098 class RenoTcpFsAgent : public RenoTcpAgent, public TcpFsAgent {
00099 public:
00100 RenoTcpFsAgent() : RenoTcpAgent(), TcpFsAgent() {}
00101
00102
00103 virtual void output_helper(Packet* pkt) {TcpFsAgent::output_helper(pkt);}
00104 virtual void recv_helper(Packet* pkt) {TcpFsAgent::recv_helper(pkt);}
00105 virtual void send_helper(int maxburst) {TcpFsAgent::send_helper(maxburst);}
00106 virtual void send_idle_helper() {TcpFsAgent::send_idle_helper();}
00107 virtual void recv_newack_helper(Packet* pkt) {TcpFsAgent::recv_newack_helper(pkt);}
00108
00109 virtual void set_rtx_timer() {TcpFsAgent::set_rtx_timer();}
00110 virtual void cancel_rtx_timer() {TcpFsAgent::cancel_rtx_timer();}
00111 virtual void cancel_timers(){TcpFsAgent::cancel_timers();}
00112 virtual void timeout_nonrtx(int tno) {TcpFsAgent::timeout_nonrtx(tno);}
00113 virtual void timeout_nonrtx_helper(int tno);
00114 };
00115
00116
00117 class NewRenoTcpFsAgent : public virtual NewRenoTcpAgent, public TcpFsAgent {
00118 public:
00119 NewRenoTcpFsAgent() : NewRenoTcpAgent(), TcpFsAgent() {}
00120
00121
00122 virtual void output_helper(Packet* pkt) {TcpFsAgent::output_helper(pkt);}
00123 virtual void recv_helper(Packet* pkt) {TcpFsAgent::recv_helper(pkt);}
00124 virtual void send_helper(int maxburst) {TcpFsAgent::send_helper(maxburst);}
00125 virtual void send_idle_helper() {TcpFsAgent::send_idle_helper();}
00126 virtual void recv_newack_helper(Packet* pkt) {TcpFsAgent::recv_newack_helper(pkt);}
00127 virtual void partialnewack_helper(Packet* pkt);
00128
00129 virtual void set_rtx_timer() {TcpFsAgent::set_rtx_timer();}
00130 virtual void cancel_rtx_timer() {TcpFsAgent::cancel_rtx_timer();}
00131 virtual void cancel_timers(){TcpFsAgent::cancel_timers();}
00132 virtual void timeout_nonrtx(int tno) {TcpFsAgent::timeout_nonrtx(tno);}
00133 virtual void timeout_nonrtx_helper(int tno);
00134 };
00135
00136 #ifdef USE_FACK
00137
00138 class FackTcpFsAgent : public FackTcpAgent, public TcpFsAgent {
00139 public:
00140 FackTcpFsAgent() : FackTcpAgent(), TcpFsAgent() {}
00141
00142
00143 virtual void output_helper(Packet* pkt) {TcpFsAgent::output_helper(pkt);}
00144 virtual void recv_helper(Packet* pkt) {TcpFsAgent::recv_helper(pkt);}
00145 virtual void send_helper(int maxburst);
00146 virtual void send_idle_helper() {TcpFsAgent::send_idle_helper();}
00147 virtual void recv_newack_helper(Packet* pkt) {TcpFsAgent::recv_newack_helper(pkt);}
00148 virtual void set_rtx_timer() {TcpFsAgent::set_rtx_timer();}
00149 virtual void cancel_rtx_timer() {TcpFsAgent::cancel_rtx_timer();}
00150 virtual void cancel_timers(){TcpFsAgent::cancel_timers();}
00151 virtual void timeout_nonrtx(int tno) {TcpFsAgent::timeout_nonrtx(tno);}
00152 virtual void timeout_nonrtx_helper(int tno);
00153 };
00154 #endif
00155
00156 #endif