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), ect_(FALSE), 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 protected:
00135 virtual void delay_bind_init_all();
00136 virtual int delay_bind_dispatch(const char *varName, const char *localName, TclObject *tracer);
00137 int closed_;
00138 int ts_option_size_;
00139 int pipe_;
00140 int pipectrl_;
00141 int rtxbytes_;
00142 int open_cwnd_on_pack_;
00143 int segs_per_ack_;
00144 int spa_thresh_;
00145 int nodelay_;
00146 int fastrecov_;
00147 int deflate_on_pack_;
00148 int data_on_syn_;
00149 double last_send_time_;
00150 int close_on_empty_;
00151 int signal_on_empty_;
00152 int reno_fastrecov_;
00153 int infinite_send_;
00154 int tcprexmtthresh_;
00155 int iss_;
00156 int irs_;
00157 int dupseg_fix_;
00158 int dupack_reset_;
00159 int halfclose_;
00160 int nopredict_;
00161 int dsack_;
00162 double delack_interval_;
00163
00164 int headersize();
00165 int outflags();
00166 int rcvseqinit(int, int);
00167 int predict_ok(Packet*);
00168 int idle_restart();
00169 int fast_retransmit(int);
00170 inline double now() { return Scheduler::instance().clock(); }
00171 virtual void newstate(int ns);
00172
00173 void bufferempty();
00174
00175 void finish();
00176 void reset_rtx_timer(int);
00177
00178 virtual void timeout_action();
00179 virtual void dupack_action();
00180 virtual void pack_action(Packet*);
00181 virtual void ack_action(Packet*);
00182 virtual void reset();
00183 virtual void send_much(int force, int reason, int maxburst = 0);
00184 virtual int build_options(hdr_tcp*);
00185 virtual int reass(Packet*);
00186 virtual void process_sack(hdr_tcp*);
00187 virtual int send_allowed(int);
00188 virtual int nxt_tseq() {
00189 return t_seqno_;
00190 }
00191 virtual void sent(int seq, int amt) {
00192 if (seq == t_seqno_)
00193 t_seqno_ += amt;
00194 pipe_ += amt;
00195 if (seq < int(maxseq_))
00196 rtxbytes_ += amt;
00197 }
00198 virtual void oldack() {
00199 dupacks_ = 0;
00200 }
00201
00202 virtual void extra_ack() {
00203 if (reno_fastrecov_)
00204 cwnd_++;
00205 }
00206
00207 void sendpacket(int seq, int ack, int flags, int dlen, int why);
00208 void connect();
00209 void listen();
00210 void usrclosed();
00211 int need_send();
00212 int foutput(int seqno, int reason = 0);
00213 void newack(Packet* pkt);
00214 int pack(Packet* pkt);
00215 void dooptions(Packet*);
00216 DelAckTimer delack_timer_;
00217 void cancel_timers();
00218 void prpkt(Packet*);
00219 char *flagstr(int);
00220 char *statestr(int);
00221
00222
00223
00224
00225 int maxseg_;
00226 int flags_;
00227 int state_;
00228 int ect_;
00229 int recent_ce_;
00230 int last_state_;
00231 int rcv_nxt_;
00232 ReassemblyQueue rq_;
00233
00234
00235
00236 int last_ack_sent_;
00237 double recent_;
00238 double recent_age_;
00239
00240
00241
00242
00243
00244 void set_initial_window();
00245 };
00246
00247 class NewRenoFullTcpAgent : public FullTcpAgent {
00248
00249 public:
00250 NewRenoFullTcpAgent();
00251 protected:
00252 int save_maxburst_;
00253 int recov_maxburst_;
00254 void pack_action(Packet*);
00255 void ack_action(Packet*);
00256 };
00257
00258 class TahoeFullTcpAgent : public FullTcpAgent {
00259 protected:
00260 void dupack_action();
00261 };
00262
00263 class SackFullTcpAgent : public FullTcpAgent {
00264 public:
00265 SackFullTcpAgent() :
00266 sq_(sack_min_), sack_min_(-1), h_seqno_(-1) { }
00267 ~SackFullTcpAgent() { rq_.clear(); }
00268 protected:
00269
00270 virtual void delay_bind_init_all();
00271 virtual int delay_bind_dispatch(const char *varName, const char *localName, TclObject *tracer);
00272
00273 virtual void pack_action(Packet*);
00274 virtual void ack_action(Packet*);
00275 virtual void dupack_action();
00276 virtual void process_sack(hdr_tcp*);
00277 virtual void timeout_action();
00278 virtual int nxt_tseq();
00279 virtual int hdrsize(int nblks);
00280 virtual int send_allowed(int);
00281 virtual void sent(int seq, int amt) {
00282 if (seq == h_seqno_)
00283 h_seqno_ += amt;
00284 FullTcpAgent::sent(seq, amt);
00285 }
00286
00287 int build_options(hdr_tcp*);
00288 int clear_on_timeout_;
00289 int sack_option_size_;
00290 int sack_block_size_;
00291 int max_sack_blocks_;
00292 int sack_rtx_bthresh_;
00293 int sack_rtx_cthresh_;
00294 int sack_rtx_threshmode_;
00295
00296
00297 void reset();
00298 void sendpacket(int seqno, int ackno, int pflags, int datalen, int reason);
00299
00300 ReassemblyQueue sq_;
00301 int sack_min_;
00302 int h_seqno_;
00303 };
00304
00305 #endif