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

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * Copyright (c) 1997 The Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. All advertising materials mentioning features or use of this software
  14.  *    must display the following acknowledgement:
  15.  *  This product includes software developed by the Network Research
  16.  *  Group at Lawrence Berkeley National Laboratory.
  17.  * 4. Neither the name of the University nor of the Laboratory may be used
  18.  *    to endorse or promote products derived from this software without
  19.  *    specific prior written permission.
  20.  *
  21.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  22.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31.  * SUCH DAMAGE.
  32.  *
  33.  * @(#) $Header: /cvsroot/nsnam/ns-2/baytcp/tcp-full-bay.h,v 1.3 2006/05/30 21:38:42 pradkin Exp $ (LBL)
  34.  */
  35. #ifndef ns_tcp_full_h
  36. #define ns_tcp_full_h
  37. #include "tcp.h"
  38. /*
  39.  * these defines are directly from tcp_var.h in "real" TCP
  40.  * they are used in the 'tcp_flags_' member variable
  41.  */
  42. #define TF_ACKNOW       0x0001          /* ack peer immediately */
  43. #define TF_DELACK       0x0002          /* ack, but try to delay it */
  44. #define TF_NODELAY      0x0004          /* don't delay packets to coalesce */
  45. #define TF_NOOPT        0x0008          /* don't use tcp options */
  46. #define TF_SENTFIN      0x0010          /* have sent FIN */
  47. #define TF_SENTSYN      0x0020          /* have sent SYN */
  48. #define TCPS_CLOSED             0       /* closed */
  49. #define TCPS_LISTEN             1       /* listening for connection */
  50. #define TCPS_SYN_SENT           2       /* active, have sent syn */
  51. #define TCPS_SYN_RECEIVED       3       /* have send and received syn */
  52. #define TCPS_ESTABLISHED        4       /* established */
  53. #define TCPS_FIN_WAIT_1         6       /* have closed, sent fin */
  54. #define TCPS_CLOSING            7       /* closed xchd FIN; await FIN ACK */
  55. #define TCPS_LAST_ACK           8       /* had fin and close; await FIN ACK */
  56. #define TCPS_FIN_WAIT_2         9       /* have closed, fin is acked */
  57. #define TCPIP_BASE_PKTSIZE      40      /* base TCP/IP header in real life */
  58. /* these are used to mark packets as to why we xmitted them */
  59. #define REASON_NORMAL   0  
  60. #define REASON_TIMEOUT  1
  61. #define REASON_DUPACK   2
  62. /* bits for the tcp_flags field below */
  63. /* from tcp.h in the "real" implementation */
  64. /* RST and URG are not used in the simulator */
  65.  
  66. #define TH_FIN  0x01        /* FIN: closing a connection */
  67. #define TH_SYN  0x02        /* SYN: starting a connection */
  68. #define TH_PUSH 0x08        /* PUSH: used here to "deliver" data */
  69. #define TH_ACK  0x10        /* ACK: ack number is valid */
  70. #define PF_TIMEOUT 0x04 /* protocol defined */
  71. /*
  72.  * inserted by kedar
  73.  */
  74. class BayFullTcpAgent;
  75. class BayDelAckTimer : public TimerHandler {
  76. public:
  77.     BayDelAckTimer(BayFullTcpAgent *a) : TimerHandler(), a_(a) { }
  78. protected:
  79.     virtual void expire(Event *);
  80.     BayFullTcpAgent *a_;
  81. };
  82.  
  83. class BayReassemblyQueue : public TcpAgent {
  84.     struct seginfo {
  85.         seginfo* next_;
  86.         seginfo* prev_;
  87.         int startseq_;
  88.         int endseq_;
  89. int flags_;
  90.     };
  91. public:
  92.     BayReassemblyQueue(int& nxt) : head_(NULL), tail_(NULL),
  93.         rcv_nxt_(nxt) { }
  94.     int empty() { return (head_ == NULL); }
  95.     int add(Packet*);
  96.     void clear();
  97. protected:
  98.     seginfo* head_;
  99.     seginfo* tail_;
  100.     int& rcv_nxt_;
  101. };
  102. /* Added by kmn 8/5/97. A hack to create a template base class for
  103.  * application agents that expect to talk to full tcps. Don't want
  104.  * to do anything fancy since the vint folks should come up with
  105.  * something one of these days.
  106.  * kmn - 8/12/97 yet another hack added to keep a list of agents
  107.  */
  108.  /* vint project never came through. Added in to recv 6/8/00 -kmn */
  109.  #define DATA_PUSH 1
  110.  #define CONNECTION_END 2
  111. class BayTcpAppAgent : public Agent {
  112.  public:
  113.   BayTcpAppAgent(packet_t ptype) : Agent(ptype) {}
  114. virtual void recv(Packet*, BayFullTcpAgent*, int) {}
  115. };
  116. class BayFullTcpAgent : public TcpAgent {
  117.  public:
  118.     BayFullTcpAgent();
  119.     ~BayFullTcpAgent();
  120.     void delay_bind_init_all();
  121.     int delay_bind_dispatch(const char *varName, const char *localName,
  122.          TclObject *tracer);
  123.     virtual void recv(Packet *pkt, Handler*);
  124.     virtual void timeout(int tno);  // tcp_timers() in real code
  125.     void advance(int);
  126.     int advance(int, int); //added 7/30/97 by kmn to pass bytes,
  127.   // set close_on_empty_
  128.     int command(int argc, const char*const* argv);
  129.     int state() { return state_; }
  130.  protected:
  131.     int segs_per_ack_;  // for window updates
  132.     int nodelay_;       // disable sender-side Nagle?
  133.     int data_on_syn_;   // send data on initial SYN?
  134.     int tcprexmtthresh_;    // fast retransmit threshold
  135.     int iss_;       // initial send seq number
  136.     int dupseg_fix_;    // fix bug with dup segs and dup acks?
  137.     int dupack_reset_;  // zero dupacks on dataful dup acks?
  138.     double delack_interval_;
  139.     int headersize();   // a tcp header
  140.     int outflags();     // state-specific tcp header flags
  141.     int predict_ok(Packet*); // predicate for recv-side header prediction
  142.     
  143.     void fast_retransmit(int);  // do a fast-retransmit on specified seg
  144.     inline double now() { return Scheduler::instance().clock(); }
  145.     void reset_rtx_timer(int);  // adjust the rtx timer
  146.     void reset();       // reset to a known point
  147.     void reinit();       // reset to a known point
  148.     void connect();     // do active open
  149.     void listen();      // do passive open
  150.     void usrclosed();   // user requested a close
  151.     int need_send();    // need to send ACK/win-update now?
  152.     void sendpacket(int seqno, int ackno, int pflags, int datalen, int reason, Packet *p=0);
  153.     void output(int seqno, int reason = 0); // output 1 packet
  154.     void send_much(int force, int reason, int maxburst = 0);
  155.     void newack(Packet* pkt);   // process an ACK
  156.     void cancel_rtx_timeout();  // cancel the rtx timeout
  157.     
  158.     /*
  159.      * the following are part of a tcpcb in "real" RFC793 TCP
  160.      */
  161.     int maxseg_;        /* MSS */
  162.     int flags_;     /* controls next output() call */
  163.     int state_;     /* enumerated type: FSM state */
  164.     int rcv_nxt_;       /* next sequence number expected */
  165.     BayReassemblyQueue rq_;    /* TCP reassembly queue */
  166.     /*
  167.      * the following are part of a tcpcb in "real" RFC1323 TCP
  168.      */
  169.     int last_ack_sent_; /* ackno field from last segment we sent */
  170.     /*
  171.      * added 7/30/97 by kmn to allow connection to close with FINs
  172.      * when empties data and to allow calling recv() on application
  173.      */
  174.     int close_on_empty_;
  175.     BayTcpAppAgent* app_;
  176.     //added 8/12 to start in ack per packet, switch to set value
  177.     int switch_spa_thresh_;
  178.     int first_data_;
  179.     int recover_cause_;
  180.     /*
  181.      *inserted by kedar
  182.      */
  183.     BayDelAckTimer delack_timer_;
  184. };
  185. class BayFullTcpList {
  186. public:
  187. BayFullTcpList() : tcp(0), next(0) {}
  188. BayFullTcpAgent* tcp;
  189. BayFullTcpList* next;
  190. };
  191. #ifdef notdef
  192. class NewRenoBayFullTcpAgent : public BayFullTcpAgent {
  193. public:
  194. NewRenoBayFullTcpAgent();
  195. protected:
  196. int save_maxburst_; // saved value of maxburst_
  197. int recov_maxburst_; // maxburst lim during recovery
  198. void pack_action(Packet*);
  199. void ack_action(Packet*);
  200. };
  201. class TahoeBayFullTcpAgent : public BayFullTcpAgent {
  202. protected:
  203. void dupack_action();
  204. };
  205. class SackBayFullTcpAgent : public BayFullTcpAgent {
  206. public:
  207. SackBayFullTcpAgent();
  208. ~SackBayFullTcpAgent();
  209. void recv(Packet*, Handler*);
  210. protected:
  211. int build_options(hdr_tcp*); // insert opts, return len
  212. int sack_option_size_; // base # bytes for sack opt (no blks)
  213. int sack_block_size_; // # bytes in a sack block (def: 8)
  214. int sack_min_; // first seq# in sack queue
  215. int sack_max_; // highest seq# seen in any sack block
  216. int sack_nxt_; // next seq# to hole-fill
  217. int max_sack_blocks_; // max # sack blocks to send
  218. BayReassemblyQueue sq_; // SACK queue, used by sender
  219. void reset();
  220. void sendpacket(int seqno, int ackno, int pflags, int datalen, int reason);
  221. void send_much(int force, int reason, int maxburst = 0);
  222. void send_holes(int force, int maxburst);
  223. void pack_action(Packet*);
  224. void ack_action(Packet*);
  225. void dupack_action();
  226. int hdrsize(int nblks);
  227. void timeout_action();
  228. };
  229. #endif
  230. #endif