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 #ifndef ns_tcp_full_h
00038 #define ns_tcp_full_h
00039
00040 #include "tcp.h"
00041 #include "rq.h"
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053 #define TF_ACKNOW 0x0001
00054 #define TF_DELACK 0x0002
00055 #define TF_NODELAY 0x0004
00056 #define TF_NOOPT 0x0008
00057 #define TF_SENTFIN 0x0010
00058 #define TF_RCVD_TSTMP 0x0100
00059 #define TF_NEEDFIN 0x0800
00060
00061
00062 #define TF_NEEDCLOSE 0x10000
00063
00064
00065
00066
00067
00068 #define TCPS_CLOSED 0
00069 #define TCPS_LISTEN 1
00070 #define TCPS_SYN_SENT 2
00071 #define TCPS_SYN_RECEIVED 3
00072 #define TCPS_ESTABLISHED 4
00073 #define TCPS_CLOSE_WAIT 5
00074 #define TCPS_FIN_WAIT_1 6
00075 #define TCPS_CLOSING 7
00076 #define TCPS_LAST_ACK 8
00077 #define TCPS_FIN_WAIT_2 9
00078
00079 #define TCP_NSTATES 10
00080
00081 #define TCPS_HAVERCVDFIN(s) ((s) == TCPS_CLOSING || (s) == TCPS_CLOSED || (s) == TCPS_CLOSE_WAIT)
00082 #define TCPS_HAVERCVDSYN(s) ((s) >= TCPS_SYN_RECEIVED)
00083
00084 #define TCPIP_BASE_PKTSIZE 40
00085
00086 #define REASON_NORMAL 0
00087 #define REASON_TIMEOUT 1
00088 #define REASON_DUPACK 2
00089 #define REASON_RBP 3
00090 #define REASON_SACK 4
00091
00092
00093
00094
00095
00096 #define TH_FIN 0x01
00097 #define TH_SYN 0x02
00098 #define TH_PUSH 0x08
00099 #define TH_ACK 0x10
00100 #define TH_ECE 0x40
00101 #define TH_CWR 0x80
00102
00103
00104 #define PF_TIMEOUT 0x04
00105 #define TCP_PAWS_IDLE (24 * 24 * 60 * 60)
00106
00107 class FullTcpAgent;
00108 class DelAckTimer : public TimerHandler {
00109 public:
00110 DelAckTimer(FullTcpAgent *a) : TimerHandler(), a_(a) { }
00111 protected:
00112 virtual void expire(Event *);
00113 FullTcpAgent *a_;
00114 };
00115
00116 class FullTcpAgent : public TcpAgent {
00117 public:
00118 FullTcpAgent() :
00119 closed_(0), pipe_(-1), rtxbytes_(0), fastrecov_(FALSE),
00120 last_send_time_(-1.0), infinite_send_(FALSE), irs_(-1),
00121 delack_timer_(this), flags_(0),
00122 state_(TCPS_CLOSED), recent_ce_(FALSE),
00123 last_state_(TCPS_CLOSED), rq_(rcv_nxt_), last_ack_sent_(-1) { }
00124
00125 ~FullTcpAgent() { cancel_timers(); rq_.clear(); }
00126 virtual void recv(Packet *pkt, Handler*);
00127 virtual void timeout(int tno);
00128 virtual void close() { usrclosed(); }
00129 void advanceby(int);
00130 void advance_bytes(int);
00131 virtual void sendmsg(int nbytes, const char *flags = 0);
00132 virtual int& size() { return maxseg_; }
00133 virtual int command(int argc, const char*const* argv);
00134 virtual void reset();
00135 protected:
00136 virtual void delay_bind_init_all();
00137 virtual int delay_bind_dispatch(const char *varName, const char *localName, TclObject *tracer);
00138 int closed_;
00139 int ts_option_size_;
00140 int pipe_;
00141 int pipectrl_;
00142 int rtxbytes_;
00143 int open_cwnd_on_pack_;
00144 int segs_per_ack_;
00145 int spa_thresh_;
00146 int nodelay_;
00147 int fastrecov_;
00148 int deflate_on_pack_;
00149 int data_on_syn_;
00150 double last_send_time_;
00151 int close_on_empty_;
00152 int signal_on_empty_;
00153 int reno_fastrecov_;
00154 int infinite_send_;
00155 int tcprexmtthresh_;
00156 int iss_;
00157 int irs_;
00158 int dupseg_fix_;
00159 int dupack_reset_;
00160 int halfclose_;
00161 int nopredict_;
00162 int ecn_syn_;
00163 int ecn_syn_wait_;
00164 int dsack_;
00165 double delack_interval_;
00166 int debug_;
00167
00168 int headersize();
00169 int outflags();
00170 int rcvseqinit(int, int);
00171 int predict_ok(Packet*);
00172 int idle_restart();
00173 int fast_retransmit(int);
00174 inline double now() { return Scheduler::instance().clock(); }
00175 virtual void newstate(int ns);
00176
00177 void bufferempty();
00178
00179 void finish();
00180 void reset_rtx_timer(int);
00181
00182 virtual void timeout_action();
00183 virtual void dupack_action();
00184 virtual void pack_action(Packet*);
00185 virtual void ack_action(Packet*);
00186 virtual void send_much(int force, int reason, int maxburst = 0);
00187 virtual int build_options(hdr_tcp*);
00188 virtual int reass(Packet*);
00189 virtual void process_sack(hdr_tcp*);
00190 virtual int send_allowed(int);
00191 virtual int nxt_tseq() {
00192 return t_seqno_;
00193 }
00194 virtual void sent(int seq, int amt) {
00195 if (seq == t_seqno_)
00196 t_seqno_ += amt;
00197 pipe_ += amt;
00198 if (seq < int(maxseq_))
00199 rtxbytes_ += amt;
00200 }
00201 virtual void oldack() {
00202 dupacks_ = 0;
00203 }
00204
00205 virtual void extra_ack() {
00206 if (reno_fastrecov_)
00207 cwnd_++;
00208 }
00209
00210 virtual void sendpacket(int seq, int ack, int flags, int dlen, int why, Packet *p=0);
00211 void connect();
00212 void listen();
00213 void usrclosed();
00214 int need_send();
00215 int foutput(int seqno, int reason = 0);
00216 void newack(Packet* pkt);
00217 int pack(Packet* pkt);
00218 void dooptions(Packet*);
00219 DelAckTimer delack_timer_;
00220 void cancel_timers();
00221 void prpkt(Packet*);
00222 char *flagstr(int);
00223 char *statestr(int);
00224
00225
00226
00227
00228 int maxseg_;
00229 int flags_;
00230 int state_;
00231 int recent_ce_;
00232 int last_state_;
00233 int rcv_nxt_;
00234 ReassemblyQueue rq_;
00235
00236
00237
00238 int last_ack_sent_;
00239 double recent_;
00240 double recent_age_;
00241
00242
00243
00244
00245
00246 void set_initial_window();
00247 };
00248
00249 class NewRenoFullTcpAgent : public FullTcpAgent {
00250
00251 public:
00252 NewRenoFullTcpAgent();
00253 protected:
00254 int save_maxburst_;
00255 int recov_maxburst_;
00256 void pack_action(Packet*);
00257 void ack_action(Packet*);
00258 };
00259
00260 class TahoeFullTcpAgent : public FullTcpAgent {
00261 protected:
00262 void dupack_action();
00263 };
00264
00265 class SackFullTcpAgent : public FullTcpAgent {
00266 public:
00267 SackFullTcpAgent() :
00268 sq_(sack_min_), sack_min_(-1), h_seqno_(-1) { }
00269 ~SackFullTcpAgent() { rq_.clear(); }
00270 protected:
00271
00272 virtual void delay_bind_init_all();
00273 virtual int delay_bind_dispatch(const char *varName, const char *localName, TclObject *tracer);
00274
00275 virtual void pack_action(Packet*);
00276 virtual void ack_action(Packet*);
00277 virtual void dupack_action();
00278 virtual void process_sack(hdr_tcp*);
00279 virtual void timeout_action();
00280 virtual int nxt_tseq();
00281 virtual int hdrsize(int nblks);
00282 virtual int send_allowed(int);
00283 virtual void sent(int seq, int amt) {
00284 if (seq == h_seqno_)
00285 h_seqno_ += amt;
00286 FullTcpAgent::sent(seq, amt);
00287 }
00288
00289 int build_options(hdr_tcp*);
00290 int clear_on_timeout_;
00291 int sack_option_size_;
00292 int sack_block_size_;
00293 int max_sack_blocks_;
00294 int sack_rtx_bthresh_;
00295 int sack_rtx_cthresh_;
00296 int sack_rtx_threshmode_;
00297
00298
00299 void reset();
00300
00301
00302
00303 ReassemblyQueue sq_;
00304 int sack_min_;
00305 int h_seqno_;
00306 };
00307
00308 #endif