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

通讯编程

开发平台:

Visual C++

  1. /* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
  2. /*
  3.  * Copyright (c) 1997 The 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 Network Research
  17.  *      Group at Lawrence Berkeley National 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.  * TCP-Linux module for NS2 
  37.  *
  38.  * May 2006
  39.  *
  40.  * Author: Xiaoliang (David) Wei  (DavidWei@acm.org)
  41.  *
  42.  * NetLab, the California Institute of Technology 
  43.  * http://netlab.caltech.edu
  44.  *
  45.  * Module: tcp-linux.h
  46.  *      This is the header file for TCP-Linux in NS-2.
  47.  *
  48.  *
  49.  * See a mini-tutorial about TCP-Linux at: http://netlab.caltech.edu/projects/ns2tcplinux/
  50.  *
  51.  */
  52. #ifndef ns_tcp_linux_h
  53. #define ns_tcp_linux_h
  54. #include "tcp.h"
  55. #include "scoreboard1.h"
  56. #include "linux/ns-linux-util.h"
  57. #define DEBUG_LEVEL 0
  58. #define DEBUG(level, ...) if (DEBUG_LEVEL>=level) printf(__VA_ARGS__);
  59. /* A list to store the parameters */
  60. class ParamList {
  61. private:
  62. typedef struct paramNode {
  63. int* addr;
  64. int value;
  65. int default_value;
  66. struct paramNode* next;
  67. };
  68. struct paramNode* head;
  69. public:
  70. ParamList():head(NULL) {};
  71. ~ParamList();
  72. /** Add this parameter to the list and set the value */
  73. void set_param(int* address, int value);
  74. bool get_param(int* address, int* valuep);
  75. /** Refresh all the values in the list */
  76. void refresh_default();
  77. /** Restore the */ 
  78. void restore_default();
  79. void load_local();
  80. };
  81. //This class provide C++ interface to access the Linux parameters for specific congestion control algorithm
  82. /* The manager of Linux parameters for each TCP */
  83. class LinuxParamManager {
  84. private:
  85. ParamList localValues;
  86. static struct cc_list* find_cc_by_proto(const char* proto);
  87. static struct cc_param_list* find_param_by_proto_name(const char* proto, const char* name);
  88. public:
  89. LinuxParamManager(){};
  90. static bool set_default_param(const char* proto, const char* param, const int value);
  91. static bool get_default_param(const char* proto, const char* param, int* valuep);
  92. static bool query_param(const char* proto);
  93. bool set_param(const char* proto, const char* param, const int value);
  94. bool get_param(const char* proto, const char* param, int* valuep);
  95. void load_local() {localValues.load_local();};
  96. void restore_default() {localValues.restore_default();};
  97. };
  98. /* TCP Linux */
  99. class LinuxTcpAgent : public TcpAgent {
  100. private:
  101. LinuxParamManager paramManager;
  102. public:
  103. LinuxTcpAgent();
  104. virtual ~LinuxTcpAgent();
  105. virtual void recv(Packet *pkt, Handler*);
  106. virtual void timeout(int tno);
  107. virtual int window();
  108. virtual double windowd();
  109. void oldack (Packet* pkt);
  110. int maxsack (Packet* pkt); 
  111. void plot();
  112. void reset();
  113. virtual void send_much(int force, int reason, int maxburst = 0);
  114. virtual int packets_in_flight();
  115. virtual int command(int argc, const char*const* argv);
  116. protected:
  117. ScoreBoard1 *scb_;
  118. struct tcp_sock linux_; // Main data structure of a Linux TCP flow
  119. bool initialized_; // a flag to record if a congestion control algorithm is initialized or not
  120. // ca_ops->init shall be run the first time an acknowledgment is processed (at least one RTT sample recorded).
  121. TracedInt next_pkts_in_flight_; //the # of packets in flight allowed, if we need rate halving
  122. virtual bool is_congestion(); // whether the network is congested?
  123. void rtt_update(double tao, unsigned long pkt_seq_no=0); //rewrite the tcp.cc functions
  124. unsigned char ack_processing(Packet* pkt, unsigned char flag); // process the ack: sequence#
  125. void time_processing(Packet* pkt, unsigned char flag,s32* seq_urtt_p); // process the ack for timestamp, timer
  126. //     these two processing functions replace 
  127. // the combination of newack() and oldack()
  128. void touch_cwnd(); // called whenever cwnd_ is changed, mark linux_.snd_cwnd_stamp
  129. void enter_loss();
  130. // void enter_frto(); We don't have FRTO yet
  131. // void enter_frto_loss(); We don't hvae FRTO yet
  132. void tcp_fastretrans_alert(unsigned char flag);
  133. void tcp_moderate_cwnd();
  134. void load_to_linux(); // the variables that shall be loaded to Linux every acks
  135. void load_to_linux_once(); // the variables that shall be loaded to Linux at boot or reset 
  136. void save_from_linux(); // the variables that shall be saved from Linux every ack
  137. char install_congestion_control(const char* name);
  138. void remove_congestion_control();
  139. inline void tcp_set_ca_state(const u8 ca_state) {
  140. if ((linux_.icsk_ca_ops)&&(linux_.icsk_ca_ops->set_state))
  141. linux_.icsk_ca_ops->set_state(&linux_, ca_state);
  142. //printf("%lf: %d State: %d->%d cwnd:%d ssthresh:%dn",Scheduler::instance().clock(), this, linux_.icsk_ca_state, ca_state, linux_.snd_cwnd, linux_.snd_ssthresh);
  143. linux_.icsk_ca_state = ca_state;
  144. };
  145. inline void tcp_ca_event(const enum tcp_ca_event event) {
  146. if ((linux_.icsk_ca_ops)&&(linux_.icsk_ca_ops->cwnd_event))
  147. linux_.icsk_ca_ops->cwnd_event(&linux_, event);
  148. //printf("%lf: %d Event: %dn",Scheduler::instance().clock(), this, event);
  149. };
  150. };
  151. class CongestionControlManager
  152. {
  153. public:
  154. CongestionControlManager();
  155. // int Register(struct tcp_congestion_ops* new_ops);
  156. struct tcp_congestion_ops* get_ops(const char* name);
  157. void dump();
  158. void scan();
  159. private:
  160. int num_;
  161. struct tcp_congestion_ops** ops_list;
  162. };
  163. extern CongestionControlManager cong_ops_manager;
  164. #endif