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

通讯编程

开发平台:

Visual C++

  1. /* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
  2. /*
  3.  * Copyright (c) 1991-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 Computer Systems
  17.  * Engineering Group at Lawrence Berkeley Laboratory.
  18.  * 4. Neither the name of the University nor of the Laboratory may be used
  19.  *    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.  */
  35.  
  36. #ifndef ns_tcpsink_h
  37. #define ns_tcpsink_h
  38. #include <math.h>
  39. #include "agent.h"
  40. #include "tcp.h"
  41. /* max window size */
  42. // #define MWS 1024  
  43. #define MWS 64
  44. #define MWM (MWS-1)
  45. #define HS_MWS 65536
  46. #define HS_MWM (MWS-1)
  47. /* For Tahoe TCP, the "window" parameter, representing the receiver's
  48.  * advertised window, should be less than MWM.  For Reno TCP, the
  49.  * "window" parameter should be less than MWM/2.
  50.  */
  51. class TcpSink;
  52. class Acker {
  53. public:
  54. Acker();
  55. virtual ~Acker() { delete[] seen_; }
  56. void update_ts(int seqno, double ts, int rfc1323 = 0);
  57. int update(int seqno, int numBytes);
  58. void update_ecn_unacked(int value);
  59. inline int Seqno() const { return (next_ - 1); }
  60. virtual void append_ack(hdr_cmn*, hdr_tcp*, int oldSeqno) const;
  61. void reset();
  62. double ts_to_echo() { return ts_to_echo_;}
  63. int ecn_unacked() { return ecn_unacked_;}
  64. inline int Maxseen() const { return (maxseen_); }
  65. void resize_buffers(int sz);  // resize the seen_ buffer
  66. protected:
  67. int next_; /* next packet expected */
  68. int maxseen_; /* max packet number seen */
  69. int wndmask_; /* window mask - either MWM or HS_MWM - Sylvia */ 
  70. int ecn_unacked_; /* ECN forwarded to sender, but not yet
  71.  * acknowledged. */
  72. int *seen_; /* array of packets seen */
  73. double ts_to_echo_; /* timestamp to echo to peer */
  74. int is_dup_; // A duplicate packet.
  75. public:
  76.         int last_ack_sent_;     // For updating timestamps, from Andrei Gurtov.
  77. };
  78. // derive Sacker from TclObject to allow for traced variable
  79. class SackStack;
  80. class Sacker : public Acker, public TclObject {
  81. public: 
  82. Sacker() : base_nblocks_(-1), sf_(0) { };
  83. ~Sacker();
  84. void append_ack(hdr_cmn*, hdr_tcp*, int oldSeqno) const;
  85. void reset();
  86. void configure(TcpSink*);
  87. protected:
  88. int base_nblocks_;
  89. int* dsacks_; // Generate DSACK blocks.
  90. SackStack *sf_;
  91. void trace(TracedVar*);
  92. };
  93. class TcpSink : public Agent {
  94. friend class XcpSink;
  95. public:
  96. TcpSink(Acker*);
  97. void recv(Packet* pkt, Handler*);
  98. void reset();
  99. int command(int argc, const char*const* argv);
  100. TracedInt& maxsackblocks() { return max_sack_blocks_; }
  101. protected:
  102. void ack(Packet*);
  103. virtual void add_to_ack(Packet* pkt);
  104.         virtual void delay_bind_init_all();
  105.         virtual int delay_bind_dispatch(const char *varName, const char *localName, TclObject *tracer);
  106. Acker* acker_;
  107. int ts_echo_bugfix_;
  108. int ts_echo_rfc1323_;  // conforms to rfc1323 for timestamps echo
  109. // Added by Andrei Gurtov
  110. friend void Sacker::configure(TcpSink*);
  111. TracedInt max_sack_blocks_; /* used only by sack sinks */
  112. Packet* save_; /* place to stash saved packet while delaying */
  113. /* used by DelAckSink */
  114. int generate_dsacks_; // used only by sack sinks
  115. int qs_enabled_; // to enable QuickStart 
  116. int RFC2581_immediate_ack_; // Used to generate ACKs immediately 
  117. int bytes_;   // for JOBS
  118. // for RFC2581-compliant gap-filling.
  119. double lastreset_;  /* W.N. used for detecting packets  */
  120. /* from previous incarnations */
  121.         int ecn_syn_;           /* allow SYN/ACK packets to be ECN-capable */
  122. };
  123. class DelAckSink;
  124. class DelayTimer : public TimerHandler {
  125. public:
  126. DelayTimer(DelAckSink *a) : TimerHandler() { a_ = a; }
  127. protected:
  128. virtual void expire(Event *e);
  129. DelAckSink *a_;
  130. };
  131. class DelAckSink : public TcpSink {
  132. public:
  133. DelAckSink(Acker* acker);
  134. void recv(Packet* pkt, Handler*);
  135. virtual void timeout(int tno);
  136. void reset();
  137. protected:
  138. double interval_;
  139. DelayTimer delay_timer_;
  140. };
  141. #endif