demarker.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: demarker.cc,v 1.1 2003/02/02 22:18:22 xuanc Exp $
  46.  */
  47. #include <string.h>
  48. #include <queue.h>
  49. #include "demarker.h"
  50. #include "tcp.h"
  51. static class DemarkerClass : public TclClass {
  52. public:
  53. DemarkerClass() : TclClass("Queue/Demarker") {}
  54. TclObject* create(int, const char*const*) {
  55. return (new Demarker);
  56. }
  57. } class_demarker;
  58. Demarker::Demarker() {
  59. q_ = new PacketQueue; 
  60.   
  61. last_monitor_update_=0.0;
  62. monitoring_window_ = 0.1;
  63. for (int i=0; i<=NO_CLASSES; i++) {
  64. demarker_arrvs_[i]=0;
  65. arrived_Bits_[i] = 0;
  66. }
  67.   // Binding arrays between cc and tcl still not supported by tclcl...
  68.   if (NO_CLASSES != 4) {
  69. printf("Change Demarker's code!!!nn");
  70. abort();
  71.   }
  72.   bind("demarker_arrvs1_",    &(demarker_arrvs_[1]));
  73.   bind("demarker_arrvs2_",    &(demarker_arrvs_[2]));
  74.   bind("demarker_arrvs3_",    &(demarker_arrvs_[3]));
  75.   bind("demarker_arrvs4_",    &(demarker_arrvs_[4]));
  76. }
  77. int Demarker::command(int argc, const char*const* argv) {
  78. if (argc == 3) {
  79. if (strcmp(argv[1], "trace-file") == 0) {
  80. file_name_ = new(char[500]);
  81. strcpy(file_name_,argv[2]);
  82. if (strcmp(file_name_,"null") != 0) {
  83. demarker_type_ = VERBOSE;
  84. for (int i=1; i<=NO_CLASSES; i++) {
  85. char filename[500]; 
  86. sprintf(filename,"%s.%d", file_name_,i);
  87. if ((delay_tr_[i] = fopen(filename,"w"))==NULL) {
  88. printf("Problem with opening the trace filesn");
  89. abort();
  90. }
  91. }
  92. } else {
  93. demarker_type_ = QUIET;
  94. }
  95. return (TCL_OK);
  96. } else if (strcmp(argv[1], "id") == 0) {
  97. link_id_ = (int)atof(argv[2]);
  98. return (TCL_OK);
  99. }
  100. return Queue::command(argc, argv);
  101. }
  102. void Demarker::enque(Packet* p) {
  103. q_->enque(p);
  104. if (q_->length() >= qlim_) {
  105. q_->remove(p);
  106. drop(p);
  107. printf("Packet drops in Demarker of type:%dn", demarker_type_);
  108. }
  109. }
  110. Packet* Demarker::deque() {
  111.   Packet* p= q_->deque();
  112.   if (p==NULL) return p;
  113.   
  114.   hdr_ip*  iph = hdr_ip::access(p);
  115.   hdr_cmn* cm_h = hdr_cmn::access(p);
  116.   double  cur_time  = Scheduler::instance().clock();
  117.   int cls = iph->prio_;
  118.   if ((cls<1) || (cls>NO_CLASSES)) {
  119.     printf("Wrong class type in Demarker-deque (S=%d, D=%d, FID=%d, Class=%d)n",
  120.    (int)(iph->src().addr_), (int)(iph->dst().addr_),
  121.    iph->fid_, iph->prio_);
  122.     
  123.     fflush(stdout);
  124.     abort();
  125.   }
  126.   demarker_arrvs_[cls] += 1.;
  127.  
  128.   if (demarker_type_ == VERBOSE) {
  129.     // Write end-to-end delay of packet in per class trace file
  130.     if (cur_time > START_STATISTICS) {
  131.       double pack_del = cur_time - cm_h->ts_arr_;
  132.       cm_h->ts_arr_=0;    // This stupid thing is required..
  133.       // print arrival time and delay
  134.       fprintf(delay_tr_[cls], "%.5f %.5fn", 
  135.       cur_time, pack_del);
  136.     }    
  137.  
  138.     return p;
  139.   }
  140.   
  141.   return p;
  142. }