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
00039 #ifndef nc_tcp_session_h
00040 #define ns_tcp_session_h
00041
00042 #include "agent.h"
00043 #include "timer-handler.h"
00044 #include "chost.h"
00045
00046 #define FINE_ROUND_ROBIN 1
00047 #define COARSE_ROUND_ROBIN 2
00048 #define RANDOM 3
00049
00050 class TcpSessionAgent;
00051
00052 class SessionRtxTimer : public TimerHandler {
00053 public:
00054 SessionRtxTimer(TcpSessionAgent *a) : TimerHandler() { a_ = a; }
00055 protected:
00056 virtual void expire(Event *e);
00057 TcpSessionAgent *a_;
00058 };
00059
00060 class SessionResetTimer : public TimerHandler {
00061 public:
00062 SessionResetTimer(TcpSessionAgent *a) : TimerHandler() { a_ = a; }
00063 protected:
00064 virtual void expire(Event *e);
00065 TcpSessionAgent *a_;
00066 };
00067
00068 class SessionBurstSndTimer : public TimerHandler {
00069 public:
00070 SessionBurstSndTimer(TcpSessionAgent *a) : TimerHandler() { a_ = a; }
00071 protected:
00072 virtual void expire(Event *e);
00073 TcpSessionAgent *a_;
00074 };
00075
00076
00077
00078
00079
00080
00081 class TcpSessionAgent : public CorresHost {
00082 public:
00083 TcpSessionAgent();
00084 int command(int argc, const char*const* argv);
00085 void reset_rtx_timer(int mild, int backoff = 1);
00086 void set_rtx_timer();
00087 void cancel_rtx_timer();
00088 void cancel_timers();
00089 void newack(Packet *pkt);
00090 int fs_pkt();
00091 void rtt_update_exact(double tao);
00092 void timeout(int tno);
00093 virtual Segment* add_pkts(int size, int seqno, int sessionSeqno, int daddr,
00094 int dport, int sport, double ts, IntTcpAgent *sender);
00095 virtual void add_agent(IntTcpAgent *agent, int size, double winMult,
00096 int winInc, int ssthresh);
00097 int window();
00098 void set_weight(IntTcpAgent *tcp, int wt);
00099 void reset_dyn_weights();
00100 IntTcpAgent *who_to_snd(int how);
00101 void send_much(IntTcpAgent *agent, int force, int reason);
00102 void recv(IntTcpAgent *agent, Packet *pkt, int amt_data_acked);
00103 void setflags(Packet *pkt);
00104 int findSessionSeqno(IntTcpAgent *sender, int seqno);
00105 void removeSessionSeqno(int sessionSeqno);
00106 void quench(int how, IntTcpAgent *sender, int seqno);
00107 virtual void traceVar(TracedVar* v);
00108
00109
00110
00111 static Islist<TcpSessionAgent> sessionList_;
00112
00113 protected:
00114 SessionRtxTimer rtx_timer_;
00115 SessionBurstSndTimer burstsnd_timer_;
00116 int sessionSeqno_;
00117 double last_send_time_;
00118 Segment *last_seg_sent_;
00119 IntTcpAgent *curConn_;
00120 int numConsecSegs_;
00121 int schedDisp_;
00122 int wtSum_;
00123 int dynWtSum_;
00124 };
00125
00126 #endif