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 #ifndef ns_tcpsink_h
00037 #define ns_tcpsink_h
00038
00039 #include <math.h>
00040 #include "agent.h"
00041 #include "tcp.h"
00042
00043
00044
00045 #define MWS 64
00046 #define MWM (MWS-1)
00047 #define HS_MWS 65536
00048 #define HS_MWM (MWS-1)
00049
00050
00051
00052
00053
00054 class TcpSink;
00055 class Acker {
00056 public:
00057 Acker();
00058 virtual ~Acker() { delete[] seen_; }
00059 void update_ts(int seqno, double ts);
00060 int update(int seqno, int numBytes);
00061 void update_ecn_unacked(int value);
00062 inline int Seqno() const { return (next_ - 1); }
00063 virtual void append_ack(hdr_cmn*, hdr_tcp*, int oldSeqno) const;
00064 void reset();
00065 double ts_to_echo() { return ts_to_echo_;}
00066 int ecn_unacked() { return ecn_unacked_;}
00067 inline int Maxseen() const { return (maxseen_); }
00068 void resize_buffers(int sz);
00069
00070 protected:
00071 int next_;
00072 int maxseen_;
00073 int wndmask_;
00074 int ecn_unacked_;
00075
00076 int *seen_;
00077 double ts_to_echo_;
00078 int is_dup_;
00079 };
00080
00081
00082 class SackStack;
00083 class Sacker : public Acker, public TclObject {
00084 public:
00085 Sacker() : base_nblocks_(-1), sf_(0) { };
00086 ~Sacker();
00087 void append_ack(hdr_cmn*, hdr_tcp*, int oldSeqno) const;
00088 void reset();
00089 void configure(TcpSink*);
00090 protected:
00091 int base_nblocks_;
00092 int* dsacks_;
00093 SackStack *sf_;
00094 void trace(TracedVar*);
00095 };
00096
00097 class TcpSink : public Agent {
00098 public:
00099 TcpSink(Acker*);
00100 void recv(Packet* pkt, Handler*);
00101 void reset();
00102 int command(int argc, const char*const* argv);
00103 TracedInt& maxsackblocks() { return max_sack_blocks_; }
00104 protected:
00105 void ack(Packet*);
00106 virtual void add_to_ack(Packet* pkt);
00107
00108 virtual void delay_bind_init_all();
00109 virtual int delay_bind_dispatch(const char *varName, const char *localName, TclObject *tracer);
00110
00111 Acker* acker_;
00112 int ts_echo_bugfix_;
00113
00114 friend void Sacker::configure(TcpSink*);
00115 TracedInt max_sack_blocks_;
00116 Packet* save_;
00117
00118 int generate_dsacks_;
00119 int qs_enabled_;
00120 int RFC2581_immediate_ack_;
00121 int bytes_;
00122
00123 double lastreset_;
00124
00125 };
00126
00127 class DelAckSink;
00128
00129 class DelayTimer : public TimerHandler {
00130 public:
00131 DelayTimer(DelAckSink *a) : TimerHandler() { a_ = a; }
00132 protected:
00133 virtual void expire(Event *e);
00134 DelAckSink *a_;
00135 };
00136
00137 class DelAckSink : public TcpSink {
00138 public:
00139 DelAckSink(Acker* acker);
00140 void recv(Packet* pkt, Handler*);
00141 virtual void timeout(int tno);
00142 void reset();
00143 protected:
00144 double interval_;
00145 DelayTimer delay_timer_;
00146 };
00147
00148 #endif