delay.cc
上传用户: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) 1996-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. #ifndef lint
  35. static const char rcsid[] =
  36.     "@(#) $Header: /cvsroot/nsnam/ns-2/link/delay.cc,v 1.28 2005/07/13 03:51:25 tomh Exp $ (LBL)";
  37. #endif
  38. #include "delay.h"
  39. #include "mcast_ctrl.h"
  40. #include "ctrMcast.h"
  41. static class LinkDelayClass : public TclClass {
  42. public:
  43. LinkDelayClass() : TclClass("DelayLink") {}
  44. TclObject* create(int /* argc */, const char*const* /* argv */) {
  45. return (new LinkDelay);
  46. }
  47. } class_delay_link;
  48. LinkDelay::LinkDelay() 
  49. : dynamic_(0), 
  50.   latest_time_(0),
  51.   itq_(0)
  52. {
  53. bind_bw("bandwidth_", &bandwidth_);
  54. bind_time("delay_", &delay_);
  55. bind_bool("avoidReordering_", &avoidReordering_);
  56. }
  57. int LinkDelay::command(int argc, const char*const* argv)
  58. {
  59. if (argc == 2) {
  60. if (strcmp(argv[1], "isDynamic") == 0) {
  61. dynamic_ = 1;
  62. itq_ = new PacketQueue();
  63. return TCL_OK;
  64. }
  65. } else if (argc == 6) {
  66. if (strcmp(argv[1], "pktintran") == 0) {
  67. int src = atoi(argv[2]);
  68. int grp = atoi(argv[3]);
  69. int from = atoi(argv[4]);
  70. int to = atoi(argv[5]);
  71. pktintran (src, grp);
  72. Tcl::instance().evalf("%s puttrace %d %d %d %d %d %d %d %d", name(), total_[0], total_[1], total_[2], total_[3], src, grp, from, to);
  73. return TCL_OK;
  74. }
  75. }
  76. return Connector::command(argc, argv);
  77. }
  78. void LinkDelay::recv(Packet* p, Handler* h)
  79. {
  80. double txt = txtime(p);
  81. Scheduler& s = Scheduler::instance();
  82. if (dynamic_) {
  83. Event* e = (Event*)p;
  84. e->time_= txt + delay_;
  85. itq_->enque(p); // for convinience, use a queue to store packets in transit
  86. s.schedule(this, p, txt + delay_);
  87. } else if (avoidReordering_) {
  88. // code from Andrei Gurtov, to prevent reordering on
  89. //   bandwidth or delay changes
  90.   double now_ = Scheduler::instance().clock();
  91.   if (txt + delay_ < latest_time_ - now_ && latest_time_ > 0) {
  92.   latest_time_+=txt;
  93.   s.schedule(target_, p, latest_time_ - now_ );
  94.   } else {
  95.   latest_time_ = now_ + txt + delay_;
  96.   s.schedule(target_, p, txt + delay_);
  97.   }
  98. } else {
  99. s.schedule(target_, p, txt + delay_);
  100. }
  101. s.schedule(h, &intr_, txt);
  102. }
  103. void LinkDelay::send(Packet* p, Handler*)
  104. {
  105. target_->recv(p, (Handler*) NULL);
  106. }
  107. void LinkDelay::reset()
  108. {
  109. Scheduler& s= Scheduler::instance();
  110. if (itq_ && itq_->length()) {
  111. Packet *np;
  112. // walk through packets currently in transit and kill 'em
  113. while ((np = itq_->deque()) != 0) {
  114. s.cancel(np);
  115. drop(np);
  116. }
  117. }
  118. }
  119. void LinkDelay::handle(Event* e)
  120. {
  121. Packet *p = itq_->deque();
  122. assert(p->time_ == e->time_);
  123. send(p, (Handler*) NULL);
  124. }
  125. void LinkDelay::pktintran(int src, int group)
  126. {
  127. int reg = 1;
  128. int prune = 30;
  129. int graft = 31;
  130. int data = 0;
  131. for (int i=0; i<4; i++) {
  132. total_[i] = 0;
  133. }
  134. if (! dynamic_)
  135. return;
  136. int len = itq_->length();
  137. while (len) {
  138. len--;
  139. Packet* p = itq_->lookup(len);
  140. hdr_ip* iph = hdr_ip::access(p);
  141. if (iph->flowid() == prune) {
  142. if (iph->saddr() == src && iph->daddr() == group) {
  143. total_[0]++;
  144. }
  145. } else if (iph->flowid() == graft) {
  146. if (iph->saddr() == src && iph->daddr() == group) {
  147. total_[1]++;
  148. }
  149. } else if (iph->flowid() == reg) {
  150. hdr_CtrMcast* ch = hdr_CtrMcast::access(p);
  151. if (ch->src() == src+1 && ch->group() == group) {
  152. total_[2]++;
  153. }
  154. } else if (iph->flowid() == data) {
  155. if (iph->saddr() == src+1 && iph->daddr() == group) {
  156. total_[3]++;
  157. }
  158. }
  159. }
  160.         //printf ("%f %d %d %d %dn", Scheduler::instance().clock(), total_[0], total_[1], total_[2],total_[3]);
  161. }