marker.cc
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:5k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * Copyright (c) 2000-2002, by the Rector and Board of Visitors of the 
  3.  * University of Virginia.
  4.  * All rights reserved.
  5.  *
  6.  * Redistribution and use in source and binary forms, 
  7.  * with or without modification, are permitted provided 
  8.  * that the following conditions are met:
  9.  *
  10.  * Redistributions of source code must retain the above 
  11.  * copyright notice, this list of conditions and the following 
  12.  * disclaimer. 
  13.  *
  14.  * Redistributions in binary form must reproduce the above 
  15.  * copyright notice, this list of conditions and the following 
  16.  * disclaimer in the documentation and/or other materials provided 
  17.  * with the distribution. 
  18.  *
  19.  * Neither the name of the University of Virginia nor the names 
  20.  * of its contributors may be used to endorse or promote products 
  21.  * derived from this software without specific prior written 
  22.  * permission. 
  23.  *
  24.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 
  25.  * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 
  26.  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
  27.  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
  28.  * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE 
  29.  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, 
  30.  * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
  31.  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
  32.  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 
  33.  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
  34.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 
  35.  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 
  36.  * THE POSSIBILITY OF SUCH DAMAGE.
  37.  */
  38. /*
  39.  *                                                                     
  40.  * Marker module for JoBS (and WTP).
  41.  *                                                                     
  42.  * Authors: Constantinos Dovrolis <dovrolis@mail.eecis.udel.edu>, 
  43.  *          Nicolas Christin <nicolas@cs.virginia.edu>, 2000-2002       
  44.  *       
  45.  * $Id: marker.cc,v 1.1 2003/02/02 22:18:22 xuanc Exp $
  46.  */
  47. #include <string.h>
  48. #include <queue.h>
  49. #include "random.h"
  50. #include "marker.h"
  51. static class MarkerClass : public TclClass {
  52.  public:
  53. MarkerClass() : TclClass("Queue/Marker") {}
  54. TclObject* create(int, const char*const*) {
  55. return (new Marker);
  56. }
  57. } class_marker;
  58. Marker::Marker() {
  59. q_ = new PacketQueue; 
  60. for (int i=0; i<=NO_CLASSES; i++) marker_arrvs_[i]=0;
  61. // How can we bind arrays between cc and tcl????
  62. if (NO_CLASSES!=4) {
  63. printf("Change Marker's code!!!nn");
  64. abort();
  65. bind("marker_arrvs1_", &(marker_arrvs_[1]));
  66. bind("marker_arrvs2_", &(marker_arrvs_[2]));
  67. bind("marker_arrvs3_", &(marker_arrvs_[3]));
  68. bind("marker_arrvs4_", &(marker_arrvs_[4]));
  69. // Some initial values for the random marking fractions
  70. marker_frc_[0]=0.0; // class-0 is not used
  71. marker_frc_[1]=0.4; 
  72. marker_frc_[2]=0.7;
  73. marker_frc_[3]=0.9; 
  74. marker_frc_[4]=1.0;
  75. }
  76. int Marker::command(int argc, const char*const* argv) {
  77. if (argc == 3) {
  78. if (!strcmp(argv[1], "marker_type")) {
  79. marker_type_ = atoi(argv[2]);
  80. if ((marker_type_ != DETERM) && (marker_type_ != STATIS)) {
  81. printf("Wrong Marker Typen");
  82. abort();
  83. }
  84. return (TCL_OK);
  85. }
  86. if (!strcmp(argv[1], "marker_class")) {
  87. marker_class_ = atoi(argv[2]);
  88. if (marker_class_<1 || marker_class_>NO_CLASSES) {
  89. printf("Wrong Marker Class:%dn", marker_class_);
  90. abort();
  91. }
  92. return (TCL_OK);
  93. }
  94. if (!strcmp(argv[1], "init-seed")) {
  95. rn_seed_ = atoi(argv[2]);
  96. Random::seed(rn_seed_);
  97. srand48((long)(rn_seed_));
  98. return (TCL_OK);
  99. }
  100. }
  101. if (argc == NO_CLASSES+2) {
  102. if (!strcmp(argv[1], "marker_frc")) {
  103. double sum = 0.0;
  104. for (int i=1; i<=NO_CLASSES; i++) {
  105. marker_frc_[i] = sum + atof(argv[1+i]);
  106. sum = marker_frc_[i];
  107. // printf("Fraction of class-%d traffic: %.3fn", 
  108. // i, marker_frc_[i]-marker_frc_[i-1]);
  109. }
  110. if (sum >  1.0) {
  111.    printf("Class marking thresholds should add to 1.0 n");
  112.    abort();
  113. return (TCL_OK);
  114. }
  115. }
  116. return Queue::command(argc, argv);
  117. }
  118. void Marker::enque(Packet* p) {
  119. hdr_ip*   iph = hdr_ip::access(p);
  120. hdr_cmn* cm_h = hdr_cmn::access(p);
  121. // Timestamp the packet's arrival in a header field
  122. // used for measuring the e2e delay of the packet
  123. // (for monitoring purposes)
  124. double  cur_time  = Scheduler::instance().clock();
  125. cm_h->ts_arr_ = cur_time;
  126. if (marker_type_ == DETERM) {
  127. // Mark with fixed class 
  128. iph->prio_ = marker_class_; 
  129. } else { 
  130. // (marker_type_ == STATIS) 
  131. // Determine probabilistically the class of this packet
  132. double rn = drand48(); 
  133. int i=0;
  134. do i++; while (rn >= marker_frc_[i]);
  135. iph->prio_ = i; 
  136. }
  137. // Count the packets arrived in this class
  138. marker_arrvs_[iph->prio_] += 1.;
  139. q_->enque(p);
  140. if (q_->length() >= qlim_) {
  141. q_->remove(p);
  142. drop(p);
  143. printf("Packet drops in Marker of type:%dn", marker_type_);
  144. }
  145. }
  146. // Nothing interesting here
  147. Packet* Marker::deque() {
  148. return q_->deque();
  149. }