00001 /* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */ 00002 /* 00003 * Copyright (c) 1996-1997 The Regents of the University of California. 00004 * All rights reserved. 00005 * 00006 * Redistribution and use in source and binary forms, with or without 00007 * modification, are permitted provided that the following conditions 00008 * are met: 00009 * 1. Redistributions of source code must retain the above copyright 00010 * notice, this list of conditions and the following disclaimer. 00011 * 2. Redistributions in binary form must reproduce the above copyright 00012 * notice, this list of conditions and the following disclaimer in the 00013 * documentation and/or other materials provided with the distribution. 00014 * 3. All advertising materials mentioning features or use of this software 00015 * must display the following acknowledgement: 00016 * This product includes software developed by the Daedalus 00017 * Research Group at the University of California, Berkeley. 00018 * 4. Neither the name of the University nor of the Research Group may be used 00019 * to endorse or promote products derived from this software without 00020 * specific prior written permission. 00021 * 00022 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 00023 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00024 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 00025 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 00026 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 00027 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 00028 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 00029 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 00030 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 00031 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 00032 * SUCH DAMAGE. 00033 * 00034 * ack-recons.cc: contributed by the Daedalus Research Group, 00035 * UC Berkeley (http://daedalus.cs.berkeley.edu). 00036 * 00037 * $Header: /cvsroot/nsnam/ns-2/tcp/ack-recons.h,v 1.4 2000/09/01 03:04:05 haoboy Exp $ 00038 */ 00039 00040 /* 00041 * TCP Ack reconstructor. This object sits on the other end of a constrained 00042 * link and intersperses TCP acks to the source (without violating the e2e 00043 * semantics of TCP acks). This allows us to get good performance for TCP 00044 * over various asymmetric networks, in conjunction with techniques to reduce 00045 * the frequency of acks (such as ack filtering) with making any changes to 00046 * the TCP source (e.g., like those implemented in tcp-asym.cc). 00047 */ 00048 00049 #ifndef ns_ack_recons_h 00050 #define ns_ack_recons_h 00051 00052 #include "semantic-packetqueue.h" 00053 00054 class AckReconsController : public TclObject { 00055 public: 00056 AckReconsController() : spq_(0) {} 00057 void recv(Packet *p, Handler *h=0); 00058 SemanticPacketQueue *spq_; 00059 }; 00060 00061 class AckRecons : public Agent { 00062 public: 00063 AckRecons(nsaddr_t src, nsaddr_t dst) : 00064 Agent(PT_TCP), spq_(0), src_(src), dst_(dst), 00065 ackTemplate_(0), ackPending_(0), lastAck_(0), 00066 lastRealAck_(0) { 00067 bind("lastTime_", &lastTime_); 00068 bind("lastAck_", &lastAck_); 00069 bind("lastRealTime_", &lastRealTime_); 00070 bind("lastRealAck_", &lastRealAck_); 00071 bind("ackInterArr_", &ackInterArr_); 00072 bind("ackSpacing_", &ackSpacing_); 00073 bind("deltaAckThresh_", &deltaAckThresh_); 00074 bind("delack_", &delack_); 00075 bind("adaptive_", &adaptive_); 00076 bind("alpha_", &alpha_); 00077 bind("size_", &size_); 00078 } 00079 int command(int argc, const char*const* argv); 00080 void handle(Event *e); 00081 void recv(Packet *p); 00082 SemanticPacketQueue *spq_; /* the corresponding queue of packets */ 00083 private: 00084 void sendack(int ack, double t); /* send ack pkt at time t */ 00085 nsaddr_t src_; /* src addr:port */ 00086 nsaddr_t dst_; /* dst addr:port */ 00087 Packet *ackTemplate_; /* used as a template for generated acks */ 00088 int ackPending_; 00089 int lastAck_; /* last ack sent by recons, maybe generated */ 00090 int lastRealAck_; /* last ack actually received on link */ 00091 double lastTime_; /* time when last ack was sent */ 00092 double lastRealTime_; /* time when last ack arrived on link */ 00093 int dupacks_; /* number of dup acks seen so far */ 00094 int size_; /* TCP packet size -- needed because TCP 00095 * acks are in terms of packets */ 00096 /* knobs/policies */ 00097 int deltaAckThresh_; /* threshold for reconstruction to kick in */ 00098 double ackInterArr_; /* estimate of arrival rate of acks */ 00099 double ackSpacing_; /* time duration between acks sent by recons */ 00100 int delack_; /* generate ack at least every delack_ acks */ 00101 int adaptive_; /* whether to adapt ack bandwidth? */ 00102 double alpha_; /* used in linear filter for ack rate est. */ 00103 }; 00104 00105 #endif