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_tcp_full_h
00037 #define ns_tcp_full_h
00038
00039 #include "tcp.h"
00040
00041
00042
00043
00044
00045
00046 #define TF_ACKNOW 0x0001
00047 #define TF_DELACK 0x0002
00048 #define TF_NODELAY 0x0004
00049 #define TF_NOOPT 0x0008
00050 #define TF_SENTFIN 0x0010
00051 #define TF_SENTSYN 0x0020
00052
00053 #define TCPS_CLOSED 0
00054 #define TCPS_LISTEN 1
00055 #define TCPS_SYN_SENT 2
00056 #define TCPS_SYN_RECEIVED 3
00057 #define TCPS_ESTABLISHED 4
00058 #define TCPS_FIN_WAIT_1 6
00059 #define TCPS_CLOSING 7
00060 #define TCPS_LAST_ACK 8
00061 #define TCPS_FIN_WAIT_2 9
00062
00063 #define TCPIP_BASE_PKTSIZE 40
00064
00065 #define REASON_NORMAL 0
00066 #define REASON_TIMEOUT 1
00067 #define REASON_DUPACK 2
00068
00069
00070
00071
00072
00073 #define TH_FIN 0x01
00074 #define TH_SYN 0x02
00075 #define TH_PUSH 0x08
00076 #define TH_ACK 0x10
00077
00078 #define PF_TIMEOUT 0x04
00079
00080
00081
00082
00083
00084 class BayFullTcpAgent;
00085
00086 class BayDelAckTimer : public TimerHandler {
00087 public:
00088 BayDelAckTimer(BayFullTcpAgent *a) : TimerHandler(), a_(a) { }
00089 protected:
00090 virtual void expire(Event *);
00091 BayFullTcpAgent *a_;
00092 };
00093
00094 class BayReassemblyQueue : public TcpAgent {
00095 struct seginfo {
00096 seginfo* next_;
00097 seginfo* prev_;
00098 int startseq_;
00099 int endseq_;
00100 int flags_;
00101 };
00102 public:
00103 BayReassemblyQueue(int& nxt) : head_(NULL), tail_(NULL),
00104 rcv_nxt_(nxt) { }
00105 int empty() { return (head_ == NULL); }
00106 int add(Packet*);
00107 void clear();
00108 protected:
00109 seginfo* head_;
00110 seginfo* tail_;
00111 int& rcv_nxt_;
00112 };
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122 #define DATA_PUSH 1
00123 #define CONNECTION_END 2
00124
00125 class BayTcpAppAgent : public Agent {
00126 public:
00127 BayTcpAppAgent(packet_t ptype) : Agent(ptype) {}
00128 virtual void recv(Packet*, BayFullTcpAgent*, int) {}
00129 };
00130
00131 class BayFullTcpAgent : public TcpAgent {
00132 public:
00133 BayFullTcpAgent();
00134 ~BayFullTcpAgent();
00135 void delay_bind_init_all();
00136 int delay_bind_dispatch(const char *varName, const char *localName,
00137 TclObject *tracer);
00138 virtual void recv(Packet *pkt, Handler*);
00139 virtual void timeout(int tno);
00140 void advance(int);
00141 int advance(int, int);
00142
00143 int command(int argc, const char*const* argv);
00144 int state() { return state_; }
00145
00146 protected:
00147 int segs_per_ack_;
00148 int nodelay_;
00149 int data_on_syn_;
00150 int tcprexmtthresh_;
00151 int iss_;
00152 int dupseg_fix_;
00153 int dupack_reset_;
00154 double delack_interval_;
00155
00156 int headersize();
00157 int outflags();
00158 int predict_ok(Packet*);
00159
00160 void fast_retransmit(int);
00161 inline double now() { return Scheduler::instance().clock(); }
00162
00163 void reset_rtx_timer(int);
00164 void reset();
00165 void reinit();
00166 void connect();
00167 void listen();
00168 void usrclosed();
00169 int need_send();
00170 void sendpacket(int seqno, int ackno, int pflags, int datalen, int reason, Packet *p=0);
00171 void output(int seqno, int reason = 0);
00172 void send_much(int force, int reason, int maxburst = 0);
00173 void newack(Packet* pkt);
00174 void cancel_rtx_timeout();
00175
00176
00177
00178
00179 int maxseg_;
00180 int flags_;
00181 int state_;
00182 int rcv_nxt_;
00183 BayReassemblyQueue rq_;
00184
00185
00186
00187 int last_ack_sent_;
00188
00189
00190
00191
00192 int close_on_empty_;
00193 BayTcpAppAgent* app_;
00194
00195 int switch_spa_thresh_;
00196 int first_data_;
00197 int recover_cause_;
00198
00199
00200
00201 BayDelAckTimer delack_timer_;
00202 };
00203
00204 class BayFullTcpList {
00205 public:
00206 BayFullTcpList() : tcp(0), next(0) {}
00207 BayFullTcpAgent* tcp;
00208 BayFullTcpList* next;
00209 };
00210
00211 #ifdef notdef
00212 class NewRenoBayFullTcpAgent : public BayFullTcpAgent {
00213 public:
00214 NewRenoBayFullTcpAgent();
00215 protected:
00216 int save_maxburst_;
00217 int recov_maxburst_;
00218 void pack_action(Packet*);
00219 void ack_action(Packet*);
00220 };
00221
00222 class TahoeBayFullTcpAgent : public BayFullTcpAgent {
00223 protected:
00224 void dupack_action();
00225 };
00226
00227 class SackBayFullTcpAgent : public BayFullTcpAgent {
00228 public:
00229 SackBayFullTcpAgent();
00230 ~SackBayFullTcpAgent();
00231 void recv(Packet*, Handler*);
00232 protected:
00233 int build_options(hdr_tcp*);
00234 int sack_option_size_;
00235 int sack_block_size_;
00236 int sack_min_;
00237 int sack_max_;
00238 int sack_nxt_;
00239 int max_sack_blocks_;
00240
00241 BayReassemblyQueue sq_;
00242
00243 void reset();
00244 void sendpacket(int seqno, int ackno, int pflags, int datalen, int reason);
00245 void send_much(int force, int reason, int maxburst = 0);
00246 void send_holes(int force, int maxburst);
00247 void pack_action(Packet*);
00248 void ack_action(Packet*);
00249 void dupack_action();
00250 int hdrsize(int nblks);
00251 void timeout_action();
00252 };
00253 #endif
00254
00255 #endif