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

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * Copyright (c) Intel Corporation 2001. All rights reserved.
  3.  *
  4.  * Licensed under the Apache License, Version 2.0 (the "License");
  5.  * you may not use this file except in compliance with the License.
  6.  * You may obtain a copy of the License at
  7.  *   http://www.apache.org/licenses/LICENSE-2.0
  8.  *
  9.  * Unless required by applicable law or agreed to in writing, software
  10.  * distributed under the License is distributed on an "AS IS" BASIS,
  11.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12.  * See the License for the specific language governing permissions and
  13.  * limitations under the License.
  14.  */
  15. /*
  16.  * Copyright (c) 1991-1997 Regents of the University of California.
  17.  * All rights reserved.
  18.  *
  19.  * Redistribution and use in source and binary forms, with or without
  20.  * modification, are permitted provided that the following conditions
  21.  * are met:
  22.  * 1. Redistributions of source code must retain the above copyright
  23.  *    notice, this list of conditions and the following disclaimer.
  24.  * 2. Redistributions in binary form must reproduce the above copyright
  25.  *    notice, this list of conditions and the following disclaimer in the
  26.  *    documentation and/or other materials provided with the distribution.
  27.  * 3. All advertising materials mentioning features or use of this software
  28.  *    must display the following acknowledgement:
  29.  * This product includes software developed by the Computer Systems
  30.  * Engineering Group at Lawrence Berkeley Laboratory.
  31.  * 4. Neither the name of the University nor of the Laboratory may be used
  32.  *    to endorse or promote products derived from this software without
  33.  *    specific prior written permission.
  34.  *
  35.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  36.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  37.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  38.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  39.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  40.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  41.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  42.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  43.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  44.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  45.  * SUCH DAMAGE.
  46.  *
  47.  */
  48. #ifndef ns_rq_h
  49. #define ns_rq_h
  50. #define RQF_MARK 1 // for debugging
  51. typedef int TcpSeq; // a TCP sequence number
  52. typedef int TcpFlag; // holds flags from TCP hdr
  53. typedef int RqFlag; // meta data (owned by ReassemblyQueue)
  54. #ifndef TRUE
  55. #define TRUE 1
  56. #endif
  57. #ifndef FALSE
  58. #define FALSE 0
  59. #endif
  60. #define RQC_CNTDUPS FALSE // count exact dups on add()?
  61. #include <stdio.h>
  62. #include <stdlib.h>
  63. /*
  64.  * ReassemblyQueue: keeps both a stack and linked list of segments
  65.  * FIFO maintains list in sequence # order (very often a FIFO)
  66.  * LIFO maintains list in insert order (used for generation of (D)SACKS
  67.  *
  68.  * Note that this code attempts to be largely independent of all
  69.  * other code (no include files from the rest of the simulator)
  70.  *
  71.  * July, 2001
  72.  * kfall@intel.com
  73.  */
  74. /* 01/03 Tom Kelly <ctk21@cam.ac.uk>
  75.  * 
  76.  * Made the newseginfo and deleteseginfo calls to avoid new/delete 
  77.  * overhead in generating SACK blocks good for HSTCP; see scoreboard-rq
  78.  */ 
  79. class ReassemblyQueue {
  80. struct seginfo {
  81. seginfo* next_; // next on FIFO list
  82. seginfo* prev_; // prev on FIFO list
  83. seginfo* snext_; // next on LIFO list
  84. seginfo* sprev_; // prev on LIFO list
  85. TcpSeq startseq_; // starting seq
  86. TcpSeq endseq_; // ending seq + 1
  87. TcpFlag pflags_; // flags derived from tcp hdr
  88. RqFlag rqflags_; // book-keeping flags
  89. int cnt_; // refs to this block
  90. };
  91. public:
  92. ReassemblyQueue(TcpSeq& rcvnxt) :
  93. head_(NULL), tail_(NULL), top_(NULL), bottom_(NULL), hint_(NULL), total_(0), rcv_nxt_(rcvnxt) { };
  94. int empty() { return (head_ == NULL); }
  95. int add(TcpSeq sseq, TcpSeq eseq, TcpFlag pflags, RqFlag rqflags = 0);
  96. int maxseq() { return (tail_ ? (tail_->endseq_) : -1); }
  97. int minseq() { return (head_ ? (head_->startseq_) : -1); }
  98. int total() { return total_; }
  99. int nexthole(TcpSeq seq, int&, int&); // find next hole above seq, also
  100. // include cnt of following blk
  101. int gensack(int *sacks, int maxsblock);
  102. void clear(); // clear FIFO, LIFO
  103. void init(TcpSeq rcvnxt) { rcv_nxt_ = rcvnxt; clear(); }
  104. TcpFlag clearto(TcpSeq); // clear FIFO, LIFO up to seq #
  105. TcpFlag cleartonxt() {  // clear FIFO, LIFO to rcv_nxt_
  106.     return (clearto(rcv_nxt_));
  107. }
  108. void dumplist(); // for debugging
  109. // cache of allocated seginfo blocks
  110. static seginfo* newseginfo();
  111. static void deleteseginfo(seginfo*);
  112. protected:
  113. static seginfo* freelist_; // cache of free seginfo blocks
  114. seginfo* head_; // head of segs linked list
  115. seginfo* tail_; // end of segs linked list
  116. seginfo* top_; // top of stack
  117. seginfo* bottom_; // bottom of stack
  118. seginfo* hint_; // hint for nexthole() function
  119. int total_; // # bytes in Reassembly Queue
  120. // rcv_nxt_ is a reference to an externally allocated TcpSeq
  121. // (aka integer)that will be updated with the highest in-sequence sequence
  122. // number added [plus 1] by the user.  This is the value ordinarily used
  123. // within TCP to set rcv_nxt and thus to set the ACK field.  It is also
  124. // used in the SACK sender as sack_min_
  125. TcpSeq& rcv_nxt_; // start seq of next expected thing
  126. TcpFlag coalesce(seginfo*, seginfo*, seginfo*);
  127. void fremove(seginfo*); // remove from FIFO
  128. void sremove(seginfo*); // remove from LIFO
  129. void push(seginfo*); // add to LIFO
  130. void cnts(seginfo *, int&, int&); // byte/blk counts
  131. };
  132. #endif