logging-data-struct.cc
上传用户: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) 2000  International Computer Science Institute
  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 ACIRI, the AT&T 
  17.  *      Center for Internet Research at ICSI (the International Computer
  18.  *      Science Institute).
  19.  * 4. Neither the name of ACIRI nor of ICSI may be used
  20.  *    to endorse or promote products derived from this software without
  21.  *    specific prior written permission.
  22.  *
  23.  * THIS SOFTWARE IS PROVIDED BY ICSI AND CONTRIBUTORS ``AS IS'' AND
  24.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  25.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  26.  * ARE DISCLAIMED.  IN NO EVENT SHALL ICSI OR CONTRIBUTORS BE LIABLE
  27.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  28.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  29.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  30.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  31.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  32.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  33.  * SUCH DAMAGE.
  34.  *
  35.  */
  36. #include "logging-data-struct.h"
  37. // ########################## LoggingDataStruct Methods ####################
  38. LoggingDataStruct::LoggingDataStruct(Node * node, RouteLogic * rtLogic, 
  39.      int sampleAddress, double estimate) {
  40.   first_ = NULL;
  41.   count_=0;
  42.   myID_ = node->nodeid();
  43.   rateEstimator_ = new RateEstimator(estimate);
  44.   reset_time_ = Scheduler::instance().clock();
  45.   gotStatusAll_ = 0;
  46.   statusArrivalRateAll_=-1;
  47.   rtLogic_ = rtLogic;
  48.   
  49.   neighbor_list_node * nextNode = node->neighbor_list_;
  50.   while (nextNode != NULL) {
  51.     int nid = nextNode->nodeid;
  52.     int nextHopID = rtLogic_->lookup_flat(nid, sampleAddress);
  53.     if (nextHopID == node->nodeid() /*|| AGGREGATE_CLASSIFICATION_MODE_FID == 1*/) {
  54.        LoggingDataStructNode * lgdsNode = new LoggingDataStructNode(nid, first_);
  55.        first_ = lgdsNode;
  56.        count_++;
  57.     }
  58.      nextNode = nextNode->next;
  59.   }
  60.     
  61. }
  62. void
  63. LoggingDataStruct::log(Packet * pkt) {
  64.   rateEstimator_->estimateRate(pkt);
  65.   hdr_ip * iph = hdr_ip::access(pkt);
  66.   ns_addr_t src = iph->src();
  67.   // there is a symmetry of routing assumption built into this computation.
  68.   // if it does not hold, we need some explicit support to know 
  69.   // which neighbor sent us this packet
  70.   int neighborID = rtLogic_->lookup_flat(myID_,src.addr_);
  71. #ifdef DEBUG_LGDS
  72.   printf("LGDS: %d total = %g rate = %g src = %d neighnorID = %dn", myID_, 
  73.  rateEstimator_->bytesArr_/500.0, rateEstimator_->estRate_, src.addr_, neighborID);
  74. #endif  
  75.   if (neighborID == myID_) return;
  76.  
  77.   LoggingDataStructNode * node = getNodeByID(neighborID);
  78.   if (node == NULL) {
  79. #ifdef DEBUG_LGDS
  80.     fprintf(stdout,"LGDS: %d neighbor not found in the struct !!n", myID_);
  81. #endif
  82.     return;
  83.     //exit(-1);
  84.   }
  85.   node->log(pkt);
  86. }
  87. //return -1 if not received status from a neighbor even once.
  88. //return 0 if not received status from a neighbor in this round.
  89. //return 1 o/w.  
  90. int 
  91. LoggingDataStruct::consolidateStatus() {
  92.   double rate = 0;
  93.   int all = 1;
  94.   LoggingDataStructNode * node = first_;
  95.   while (node != NULL) {
  96.     if (!node->gotStatus_) {
  97.       if (node->statusArrivalRate_<0) {
  98. //condition 1 above.
  99. printf("LGDS: Error: This should never happen nown");
  100. exit(-1);
  101. //return -1;
  102.       }
  103.       else {
  104. all = 0;
  105.       }
  106.     }
  107.     rate += node->statusArrivalRate_;
  108.     node = node->next_;
  109.   }
  110.   gotStatusAll_ = all;
  111.   statusArrivalRateAll_=rate;
  112.   return all;
  113. }
  114. void
  115. LoggingDataStruct::resetStatus() {
  116.   LoggingDataStructNode * node = first_;
  117.   while (node != NULL) {
  118.     node->gotStatus_=0;
  119.     node = node->next_;
  120.   }
  121. }
  122.   
  123. void
  124. LoggingDataStruct::registerStatus(int sender, double arrRate) {
  125.   
  126.   LoggingDataStructNode * node = getNodeByID(sender);
  127.   
  128.   if (node == NULL) {
  129.     printf("LGDS: sender not in my list (status processing)n");
  130.     exit(-1);
  131.   }
  132.   
  133.   node->registerStatus(arrRate);
  134. }
  135. LoggingDataStructNode *
  136. LoggingDataStruct::getNodeByID(int id) {
  137.   
  138.   LoggingDataStructNode * node = first_;
  139.   while (node != NULL) {
  140.     if (node->nid_ == id) {
  141.       return node;
  142.     }
  143.     node = node->next_;
  144.   }
  145.   
  146.   return NULL;
  147. }
  148. LoggingDataStruct::~LoggingDataStruct() {
  149.   LoggingDataStructNode * node = first_;
  150.   while (node!=NULL) {
  151.     LoggingDataStructNode * next = node->next_;
  152.     delete(node);
  153.     node = next;
  154.   }
  155.   delete(rateEstimator_);
  156. }
  157. // ########################## LoggingDataStructNode Methods ####################
  158. LoggingDataStructNode::LoggingDataStructNode(int id, LoggingDataStructNode * next) {
  159.   
  160.   //printf("LGDSN: Setting up node for %dn", id);
  161.   nid_ = id;
  162.   rateEstimator_ = new RateEstimator();
  163.   pushbackSent_ = 0;
  164.   limit_ = -1;
  165.   gotStatus_ = 0; 
  166.   statusArrivalRate_ = -1;
  167.   countLessReportedRate_=0;
  168.   sentRefresh_=0;
  169.   next_ = next;
  170. }
  171. void
  172. LoggingDataStructNode::pushbackSent(double limit, double expectedStatusRate) {
  173.   pushbackSent_ = 1;
  174.   limit_ = limit;
  175.   statusArrivalRate_ = expectedStatusRate;
  176. }
  177. void
  178. LoggingDataStructNode::sentRefresh(double limit) {
  179.   sentRefresh_ = 1;
  180.   limit_ = limit;
  181. }
  182. void
  183. LoggingDataStructNode::registerStatus(double arrRate) {
  184.   gotStatus_ = 1;
  185.   
  186.   //not doing precise math for floating imprecision
  187.   if (limit_ < INFINITE_LIMIT - 1 ) {
  188.     statusArrivalRate_ = arrRate;
  189.     countLessReportedRate_=0;
  190.     return;
  191.   }
  192.   if (arrRate >= statusArrivalRate_) {
  193.     statusArrivalRate_ = arrRate;
  194.     countLessReportedRate_=0;
  195.     return;
  196.   } else {
  197.     countLessReportedRate_++;
  198.     if (countLessReportedRate_ > 1) {
  199.       statusArrivalRate_=(arrRate+statusArrivalRate_)/2;
  200.       return;
  201.     }
  202.     else {
  203.       //keep the old rate
  204.     }
  205.   }
  206. }
  207. void
  208. LoggingDataStructNode::log(Packet * pkt) {
  209.   rateEstimator_->estimateRate(pkt);
  210. #ifdef DEBUG_LGDSN
  211.   printf("LGDSN: for neighbor %d total = %g rate = %g n", nid_, 
  212.  rateEstimator_->bytesArr_/500.0, rateEstimator_->estRate_);
  213. #endif
  214. }
  215.   
  216. LoggingDataStructNode::~LoggingDataStructNode() {
  217.   delete(rateEstimator_);
  218. }