chost.h
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:6k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
  2. /*
  3.  * Copyright (c) 1997 Regents of the University of California.
  4.  * All rights reserved.
  5.  * 
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  * 1. Redistributions of source code must retain the above copyright
  10.  *    notice, this list of conditions and the following disclaimer.
  11.  * 2. Redistributions in binary form must reproduce the above copyright
  12.  *    notice, this list of conditions and the following disclaimer in the
  13.  *    documentation and/or other materials provided with the distribution.
  14.  * 3. All advertising materials mentioning features or use of this software
  15.  *    must display the following acknowledgement:
  16.  *  This product includes software developed by the Daedalus Research
  17.  *  Group at the University of California Berkeley.
  18.  * 4. Neither the name of the University nor of the Research Group may be
  19.  *    used to endorse or promote products derived from this software without
  20.  *    specific prior written permission.
  21.  * 
  22.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  23.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  24.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  25.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  26.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  27.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  28.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  29.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  30.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  31.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  32.  * SUCH DAMAGE.
  33.  */
  34. #ifndef CHOST
  35. #define CHOST
  36. #include "agent.h"
  37. #include "packet.h"
  38. #include "tcp.h"
  39. #include "tcp-fs.h"
  40. #include "tcp-int.h"
  41. #include "nilist.h"
  42. #define MAX_PARALLEL_CONN 1000
  43. class Segment : public slink {
  44. friend class CorresHost;
  45. friend class TcpSessionAgent;
  46.   public:
  47. Segment() {ts_ = 0;
  48. seqno_ = later_acks_ = dupacks_ = dport_ = sport_ = size_ = rxmitted_ = 
  49. daddr_ = 0; thresh_dupacks_ = 0; partialack_ = 0;};
  50.   protected:
  51. int seqno_;
  52. int sessionSeqno_;
  53. int daddr_;
  54. int dport_;
  55. int sport_;
  56. int size_;
  57. double ts_; /* timestamp */
  58. int dupacks_;     /* on same connection */
  59. int later_acks_;  /* on other connections */
  60. int thresh_dupacks_; /* whether there have been a threshold # of
  61. dupacks/later acks for this segment */
  62. int partialack_;  /* whether a partial ack points to this segment */
  63. short rxmitted_;
  64. class IntTcpAgent *sender_;
  65. };
  66. class CorresHost : public slink, public TcpFsAgent {
  67. friend class IntTcpAgent;
  68.   public:
  69. CorresHost();
  70. /* add pkt to pipe */
  71. virtual Segment* add_pkts(int size, int seqno, int sessionSeqno, int daddr, 
  72.       int dport, int sport, double ts, IntTcpAgent *sender); 
  73. /* remove pkt from pipe */
  74. int clean_segs(int size, Packet *pkt, IntTcpAgent *sender, int sessionSeqno,
  75.        int amt_data_acked);
  76. int rmv_old_segs(Packet *pkt, IntTcpAgent *sender, int amt_data_acked);
  77. void opencwnd(int size, IntTcpAgent *sender=0);
  78. void closecwnd(int how, double ts, IntTcpAgent *sender=0);
  79. void closecwnd(int how, IntTcpAgent *sender=0);
  80. void adjust_ownd(int size);
  81. int ok_to_snd(int size);
  82. virtual void add_agent(IntTcpAgent *agent, int size, double winMult,
  83.        int winInc, int ssthresh);
  84. void del_agent(IntTcpAgent *) {nActive_--;};
  85. void agent_tout(IntTcpAgent *) {nTimeout_++;};
  86. void agent_ftout(IntTcpAgent *) {nTimeout_--;};
  87. void agent_rcov(IntTcpAgent *) {nFastRec_++;};
  88. void agent_frcov(IntTcpAgent *) {nFastRec_--;};
  89. void quench(int how);
  90.   protected:
  91. Islist<IntTcpAgent> conns_; /* active connections */
  92. Islist_iter<IntTcpAgent> *connIter_;
  93. u_int nActive_;      /* number of active tcp conns to this host */
  94. u_int nTimeout_;     /* number of tcp conns to this host in timeout */
  95. u_int nFastRec_;     /* number of tcp conns to this host in recovery */
  96. double closecwTS_; 
  97. double winMult_;
  98. int winInc_;
  99. TracedDouble ownd_;  /* outstanding data to host */
  100. TracedDouble owndCorrection_; /* correction factor to account for dupacks */   
  101. int proxyopt_;      /* indicates whether the connections are on behalf
  102.         of distinct users (like those from a proxy) */
  103. int fixedIw_;        /* fixed initial window (not a function of # conn) */
  104. Islist<Segment> seglist_; /* list of unack'd segments to peer */
  105. double lastackTS_;
  106. /*
  107.  * State encompassing the round-trip-time estimate.
  108.  * srtt and rttvar are stored as fixed point;
  109.  * srtt has 3 bits to the right of the binary point, rttvar has 2.
  110.  */
  111. double wndInit_;    /* should = path_mtu_ */
  112. Segment *rtt_seg_;  /* segment being timed for RTT computation */
  113. int dontAdjustOwnd_;/* don't adjust ownd in response to dupacks */
  114. int dontIncrCwnd_;  /* set when pkt loss is suspected (e.g., there is
  115.        reordering) */
  116. int rexmtSegCount_; /* number of segments that we "suspect" need to be
  117.        retransmitted */
  118. int disableIntLossRecov_; /* disable integrated loss recovery */
  119. /* possible candidates for rxmission */
  120. Segment *curArray_[MAX_PARALLEL_CONN]; 
  121. Segment *prevArray_[MAX_PARALLEL_CONN]; /* prev segs */
  122. /* variables for fast start */
  123. class IntTcpAgent *connWithPktBeforeFS_;
  124. /* following is for right-edge timer recovery */
  125. /* int pending_;*/
  126. Event timer_;
  127. inline void cancel() {
  128. (void)Scheduler::instance().cancel(&timer_);
  129. // No need to free event since it's statically allocated.
  130. /* pending_ = 0;*/
  131. }
  132. };
  133. #endif