snoop.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 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 MASH Research
  17.  *  Group at the University of California Berkeley.
  18.  * 4. Neither the name of the University nor of the Research Group may be
  19.  *    used 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.  * @(#) $Header: /cvsroot/nsnam/ns-2/tcp/snoop.h,v 1.14 2002/05/06 22:23:16 difa Exp $ (UCB)
  35.  */
  36. #ifndef ns_snoop_h
  37. #define ns_snoop_h
  38. #include "scheduler.h"
  39. #include "packet.h"
  40. #include "ip.h"
  41. #include "tcp.h"
  42. #include "ll.h"
  43. #include "mac.h"
  44. #include "flags.h"
  45. #include "template.h"
  46. /* Snoop states */
  47. #define SNOOP_ACTIVE    0x01 /* connection active */
  48. #define SNOOP_CLOSED    0x02 /* connection closed */
  49. #define SNOOP_NOACK     0x04 /* no ack seen yet */
  50. #define SNOOP_FULL      0x08 /* snoop cache full */
  51. #define SNOOP_RTTFLAG   0x10 /* can compute RTT if this is set */
  52. #define SNOOP_ALIVE     0x20 /* connection has been alive past 1 sec */
  53. #define SNOOP_WLALIVE   0x40 /* wl connection has been alive past 1 sec */
  54. #define SNOOP_WLEMPTY   0x80
  55. #define SNOOP_MAXWIND   100 /* XXX */
  56. #define SNOOP_WLSEQS    8
  57. #define SNOOP_MIN_TIMO  0.100 /* in seconds */
  58. #define SNOOP_MAX_RXMIT 10 /* quite arbitrary at this point */
  59. #define SNOOP_PROPAGATE 1
  60. #define SNOOP_SUPPRESS  2
  61. #define SNOOP_MAKEHANDLER 1
  62. #define SNOOP_TAIL 1
  63. struct hdr_seq {
  64. int seq;
  65. int num;
  66. };
  67. struct hdr_snoop {
  68. int seqno_;
  69. int numRxmit_;
  70. int senderRxmit_;
  71. double sndTime_;
  72. static int offset_;
  73. inline static int& offset() { return offset_; }
  74. inline static hdr_snoop* access(const Packet* p) {
  75. return (hdr_snoop*) p->access(offset_);
  76. }
  77. inline int& seqno() { return seqno_; }
  78. inline int& numRxmit() { return numRxmit_; }
  79. inline int& senderRxmit() { return senderRxmit_; }
  80. inline double& sndTime() { return sndTime_; }
  81. };
  82. class LLSnoop : public LL {
  83.   public:
  84. LLSnoop() : LL() { bind("integrate_", &integrate_);}
  85. void recv(Packet *, Handler *);
  86. void snoop_rtt(double);
  87. inline double timeout() { 
  88. return max(srtt_+4*rttvar_, snoopTick_);
  89. }
  90. inline int integrate() { return integrate_; }
  91.   protected:
  92. int    integrate_;
  93. double srtt_;
  94. double rttvar_;
  95. double g_;
  96. double snoopTick_; /* minimum rxmission timer granularity */
  97. };
  98. class SnoopRxmitHandler;
  99. class SnoopPersistHandler;
  100. class Snoop : public NsObject {
  101. friend class SnoopRxmitHandler;
  102. friend class SnoopPersistHandler;
  103.   public:
  104. Snoop();
  105. void recv(Packet *, Handler *);
  106. void handle(Event *);
  107. int snoop_rxmit(Packet *);
  108. inline int next(int i) { return (i+1) % maxbufs_; }
  109. inline int prev(int i) { return ((i == 0) ? maxbufs_-1 : i-1); };
  110. inline int wl_next(int i) { return (i+1) % SNOOP_WLSEQS; }
  111. inline int wl_prev(int i) { return ((i == 0) ? SNOOP_WLSEQS-1 : i-1);};
  112.   protected:
  113. int command(int argc, const char*const* argv);
  114. void reset();
  115. void wlreset();
  116. void snoop_data(Packet *);
  117. int  snoop_ack(Packet *);
  118. void snoop_wless_data(Packet *);
  119. void snoop_wired_ack(Packet *);
  120. int  snoop_wlessloss(int);
  121. double snoop_cleanbufs_(int);
  122. void snoop_rtt(double);
  123. int snoop_qlong();
  124. int snoop_insert(Packet *);
  125. inline int empty_()
  126. {return (bufhead_==buftail_ &&!(fstate_&SNOOP_FULL));}
  127. void savepkt_(Packet *, int, int);
  128. void update_state_();
  129. inline double timeout() { 
  130. if (!parent_->integrate())
  131. return max(srtt_+4*rttvar_, snoopTick_);
  132. else
  133. return parent_->timeout();
  134. }
  135. void snoop_cleanup();
  136. LLSnoop *parent_; /* the parent link layer object */
  137. NsObject* recvtarget_; /* where packet is passed up the stack */
  138. Handler  *callback_;
  139. SnoopRxmitHandler *rxmitHandler_; /* used in rexmissions */
  140. SnoopPersistHandler *persistHandler_; /* for connection (in)activity */
  141. int      snoopDisable_; /* disable snoop for this mobile */
  142. u_short  fstate_; /* state of connection */
  143. int      lastSeen_; /* first byte of last packet buffered */
  144.         int      lastAck_; /* last byte recd. by mh for sure */
  145. int      expNextAck_; /* expected next ack after dup sequence */
  146. short    expDupacks_; /* expected number of dup acks */
  147. double   srtt_; /* smoothed rtt estimate */
  148. double   rttvar_; /* linear deviation */
  149. double   tailTime_; /* time at which earliest unack'd pkt sent */
  150. int      rxmitStatus_;
  151. short    bufhead_; /* next pkt goes here */
  152. Event    *toutPending_; /* # pending timeouts */
  153. short    buftail_; /* first unack'd pkt */
  154. Packet   *pkts_[SNOOP_MAXWIND]; /* ringbuf of cached pkts */
  155. int      wl_state_;
  156. int      wl_lastSeen_;
  157. int      wl_lastAck_;
  158. int      wl_bufhead_;
  159. int      wl_buftail_;
  160. hdr_seq  *wlseqs_[SNOOP_WLSEQS]; /* ringbuf of wless data */
  161. int      maxbufs_; /* max number of pkt bufs */
  162. double   snoopTick_; /* minimum rxmission timer granularity */
  163. double   g_; /* gain in EWMA for srtt_ and rttvar_ */
  164. int      integrate_; /* integrate loss rec across active conns */
  165. int      lru_; /* an lru cache? */
  166. };
  167. class SnoopRxmitHandler : public Handler {
  168.   public:
  169. SnoopRxmitHandler(Snoop *s) : snoop_(s) {}
  170. void handle(Event *event);
  171.   protected:
  172. Snoop *snoop_;
  173. };
  174. class SnoopPersistHandler : public Handler {
  175.   public:
  176. SnoopPersistHandler(Snoop *s) : snoop_(s) {}
  177. //void handle(Event *);
  178.   protected:
  179. Snoop *snoop_;
  180. };
  181. #endif