📄 rq.h
字号:
/* * Copyright (c) Intel Corporation 2001. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *//* * Copyright (c) 1991-1997 Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the Computer Systems * Engineering Group at Lawrence Berkeley Laboratory. * 4. Neither the name of the University nor of the Laboratory may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * */#ifndef ns_rq_h#define ns_rq_h#define RQF_MARK 1 // for debuggingtypedef int TcpSeq; // a TCP sequence numbertypedef int TcpFlag; // holds flags from TCP hdrtypedef int RqFlag; // meta data (owned by ReassemblyQueue)#ifndef TRUE#define TRUE 1#endif#ifndef FALSE#define FALSE 0#endif#define RQC_CNTDUPS FALSE // count exact dups on add()?#include <stdio.h>#include <stdlib.h>/* * ReassemblyQueue: keeps both a stack and linked list of segments * FIFO maintains list in sequence # order (very often a FIFO) * LIFO maintains list in insert order (used for generation of (D)SACKS * * Note that this code attempts to be largely independent of all * other code (no include files from the rest of the simulator) * * July, 2001 * kfall@intel.com *//* 01/03 Tom Kelly <ctk21@cam.ac.uk> * * Made the newseginfo and deleteseginfo calls to avoid new/delete * overhead in generating SACK blocks good for HSTCP; see scoreboard-rq */ class ReassemblyQueue { struct seginfo { seginfo* next_; // next on FIFO list seginfo* prev_; // prev on FIFO list seginfo* snext_; // next on LIFO list seginfo* sprev_; // prev on LIFO list TcpSeq startseq_; // starting seq TcpSeq endseq_; // ending seq + 1 TcpFlag pflags_; // flags derived from tcp hdr RqFlag rqflags_; // book-keeping flags int cnt_; // refs to this block };public: ReassemblyQueue(TcpSeq& rcvnxt) : head_(NULL), tail_(NULL), top_(NULL), bottom_(NULL), hint_(NULL), total_(0), rcv_nxt_(rcvnxt) { }; int empty() { return (head_ == NULL); } int add(TcpSeq sseq, TcpSeq eseq, TcpFlag pflags, RqFlag rqflags = 0); int maxseq() { return (tail_ ? (tail_->endseq_) : -1); } int minseq() { return (head_ ? (head_->startseq_) : -1); } int total() { return total_; } int nexthole(TcpSeq seq, int&, int&); // find next hole above seq, also // include cnt of following blk int gensack(int *sacks, int maxsblock); void clear(); // clear FIFO, LIFO void init(TcpSeq rcvnxt) { rcv_nxt_ = rcvnxt; clear(); } TcpFlag clearto(TcpSeq); // clear FIFO, LIFO up to seq # TcpFlag cleartonxt() { // clear FIFO, LIFO to rcv_nxt_ return (clearto(rcv_nxt_)); } void dumplist(); // for debugging // cache of allocated seginfo blocks static seginfo* newseginfo(); static void deleteseginfo(seginfo*); protected: static seginfo* freelist_; // cache of free seginfo blocks seginfo* head_; // head of segs linked list seginfo* tail_; // end of segs linked list seginfo* top_; // top of stack seginfo* bottom_; // bottom of stack seginfo* hint_; // hint for nexthole() function int total_; // # bytes in Reassembly Queue // rcv_nxt_ is a reference to an externally allocated TcpSeq // (aka integer)that will be updated with the highest in-sequence sequence // number added [plus 1] by the user. This is the value ordinarily used // within TCP to set rcv_nxt and thus to set the ACK field. It is also // used in the SACK sender as sack_min_ TcpSeq& rcv_nxt_; // start seq of next expected thing TcpFlag coalesce(seginfo*, seginfo*, seginfo*); void fremove(seginfo*); // remove from FIFO void sremove(seginfo*); // remove from LIFO void push(seginfo*); // add to LIFO void cnts(seginfo *, int&, int&); // byte/blk counts};#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -