xcp-end-sys.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) 2004-2006 by the University of Southern California,
  4.  *     Information Sciences Institute
  5.  *                    2002 by Dina Katabi
  6.  * $Id: xcp-end-sys.h,v 1.10 2006/05/30 20:30:30 pradkin Exp $
  7.  *
  8.  * This program is free software; you can redistribute it and/or
  9.  * modify it under the terms of the GNU General Public License,
  10.  * version 2, as published by the Free Software Foundation.
  11.  *
  12.  * This program is distributed in the hope that it will be useful,
  13.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.  * GNU General Public License for more details.
  16.  *
  17.  * You should have received a copy of the GNU General Public License along
  18.  * with this program; if not, write to the Free Software Foundation, Inc.,
  19.  * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
  20.  *
  21.  * All rights reserved.
  22.  *
  23.  * Redistribution and use in source and binary forms are permitted
  24.  * provided that the above copyright notice and this paragraph are
  25.  * duplicated in all such forms and that any documentation, advertising
  26.  * materials, and other materials related to such distribution and use
  27.  * acknowledge that the software was developed by the University of
  28.  * Southern California, Information Sciences Institute.  The name of the
  29.  * University may not be used to endorse or promote products derived from
  30.  * this software without specific prior written permission.
  31.  *
  32.  * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
  33.  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  34.  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  35.  *
  36.  * $Header: /cvsroot/nsnam/ns-2/xcp/xcp-end-sys.h,v 1.10 2006/05/30 20:30:30 pradkin Exp $
  37.  */
  38. #ifndef ns_xcp_end_sys_h
  39. #define ns_xcp_end_sys_h
  40. #include <stdio.h>
  41. #include <stdlib.h>
  42. #include <sys/types.h>
  43. #include "ip.h"
  44. #include "tcp.h"
  45. #include "flags.h"
  46. #include "agent.h"
  47. #include "packet.h"
  48. #include "flags.h"
  49. #include "tcp-sink.h"
  50. #include "tcp-full.h"
  51. #define XCP_HDR_LEN  20 // to match the internet draft 
  52. struct hdr_xcp {
  53. double  x_; //idealized inter-packet time
  54. double rtt_;
  55. enum {
  56. XCP_DISABLED = 0,
  57. XCP_ENABLED,
  58. XCP_ACK,
  59. }  xcp_enabled_; // to indicate that the flow is XCP enabled
  60. int xcpId_; // Sender's ID (debugging only)
  61. double cwnd_; // The current window (debugging only) 
  62. double reverse_feedback_;
  63. // --- Initialized by source and Updated by Router 
  64. double delta_throughput_;
  65. unsigned int controlling_hop_;  // The AQM ID of the controlling router
  66. static int offset_;     // offset for this header
  67. inline static int& offset() { return offset_; }
  68. inline static hdr_xcp* access(Packet* p) {
  69. return (hdr_xcp*) p->access(offset_);
  70. }
  71. /* per-field member functions */
  72. double& cwnd() { return (cwnd_); }
  73. double& rtt() { return (rtt_); }
  74. };
  75. #define MAX(a,b) ((a) > (b) ? (a) : (b))
  76. #define TP_TO_TICKS MAX(1, (t_srtt_ >> T_SRTT_BITS))
  77. #define TP_AVG_EXP 4 // used for xcp_metered_output_ == true
  78. //Base class for Tcp and FullTcp XCP agents
  79. class XcpEndsys {
  80. protected:
  81. XcpEndsys(TcpAgent* tcp);
  82. void trace_var(const char *var_name, double var) const;
  83. void opencwnd() { /* nothing, cwnd is conrolled in recv() */ }
  84. void rtt_update(double tao);
  85. void init_rtt_vars() { srtt_estimate_ = 0.0; }
  86. void rtt_init();
  87. void recv(Packet *);
  88. void send(Packet *, int datalen);
  89. TcpAgent *tcp_;
  90. double xcp_rev_fb_; /* Accumulated throughput change to send back, B/s */
  91. double current_positive_feedback_ ;
  92. int tcpId_;
  93. double srtt_estimate_;
  94. long xcp_srtt_; // srtt estimate using the above macros
  95. /* more bits in delta for better precision, just for SRTT */
  96. #define XCP_DELTA_SHIFT 5
  97. #define XCP_EXPO_SHIFT 3
  98. #define XCP_RTT_SHIFT (XCP_DELTA_SHIFT + XCP_EXPO_SHIFT)
  99. /* macros for SRTT calculations */
  100. #define XCP_INIT_SRTT(rtt)
  101. ((rtt) << XCP_RTT_SHIFT)
  102.    
  103. #define XCP_UPDATE_SRTT(srtt, rtt)
  104. ((srtt) + (((rtt) << XCP_DELTA_SHIFT)
  105.    - (((srtt) + (1 << (XCP_EXPO_SHIFT - 1)))
  106.       >> XCP_EXPO_SHIFT)))
  107. static unsigned int next_xcp_;
  108. };
  109. class XcpNewRenoFullTcpAgent : public NewRenoFullTcpAgent,
  110.        public XcpEndsys {
  111. public:
  112. XcpNewRenoFullTcpAgent();
  113. protected:
  114. /*New*/
  115. virtual void delay_bind_init_all();
  116. virtual int delay_bind_dispatch(const char *varName, 
  117. const char *localName, 
  118. TclObject *tracer);
  119. /*New*/
  120. virtual void opencwnd() { XcpEndsys::opencwnd(); }
  121. virtual void recv(Packet *, Handler *); 
  122. virtual void sendpacket(int seq, int ack, int flags, int dlen, int why, Packet *p=0);
  123. virtual void rtt_init(); // called in reset()
  124. virtual void rtt_update(double);
  125. };
  126. class XcpRenoTcpAgent : public RenoTcpAgent,
  127. public XcpEndsys {
  128. public:
  129. XcpRenoTcpAgent();
  130. protected:
  131. virtual void delay_bind_init_all();
  132. virtual int delay_bind_dispatch(const char *varName, 
  133. const char *localName, 
  134. TclObject *tracer);
  135.         virtual void output_helper(Packet *);
  136.         virtual void recv_newack_helper(Packet *);
  137.         virtual void opencwnd() { XcpEndsys::opencwnd(); }
  138.         virtual void rtt_init(); // called in reset()
  139.         virtual void rtt_update(double);
  140. };
  141. class XcpTcpSink : public TcpSink,
  142. public XcpEndsys {
  143. public:
  144. XcpTcpSink(Acker *);
  145. virtual void recv(Packet* pkt, Handler*);
  146. protected:
  147.         virtual void add_to_ack(Packet*);
  148.         virtual void delay_bind_init_all();
  149.         virtual int delay_bind_dispatch(const char *varName,
  150. const char *localName,
  151. TclObject *tracer);
  152. };
  153. #endif /* ns_xcp_end_sys_h */