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

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * Copyright (c) 2007 Regents of the SIGNET lab, University of Padova.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. Neither the name of the University of Padova (SIGNET lab) nor the 
  14.  *    names of its contributors may be used to endorse or promote products 
  15.  *    derived from this software without specific prior written permission.
  16.  *
  17.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
  18.  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 
  19.  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 
  20.  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 
  21.  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
  22.  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
  23.  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 
  24.  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
  25.  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 
  26.  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 
  27.  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  28.  */
  29. #include "arf.h"
  30. #include"mac-802_11mr.h"
  31. static class ARFClass : public TclClass {
  32. public:
  33. ARFClass() : TclClass("RateAdapter/ARF") {}
  34. TclObject* create(int, const char*const*) {
  35. return (new ARF());
  36. }
  37. } class_arf;
  38. ARF::ARF() 
  39.   : nSuccess_(0), nFailed_(0), 
  40.     justTimedOut(false), justIncr(false)
  41. {
  42.   bind("timeout_", &timeout_);
  43.   bind("numSuccToIncrRate_", &numSuccToIncrRate_);
  44.   bind("numFailToDecrRate_", &numFailToDecrRate_);
  45.   bind("numFailToDecrRateAfterTout_", &numFailToDecrRateAfterTout_);
  46.   bind("numFailToDecrRateAfterIncr_", &numFailToDecrRateAfterIncr_);
  47. }
  48. ARF::~ARF()
  49. {
  50. }
  51. int ARF::command(int argc, const char*const* argv)
  52. {
  53.   
  54.   // Add TCL commands here...
  55.   // Fallback for unknown commands
  56.   return RateAdapter::command(argc, argv);
  57. }
  58. void ARF::counterEvent(CounterId id)
  59. {
  60.   if(debug_>3) 
  61.     cerr << "ARF::counterEvent()" << endl;
  62.   switch(id) 
  63.     {
  64.     case ID_MPDUTxSuccessful :    
  65.       TxSuccessfulAction();
  66.       break;
  67.     case ID_ACKFailed:
  68.     case ID_RTSFailed:   
  69.    
  70.       TxFailedAction();
  71.       break;
  72.     default:
  73.       break;
  74.       
  75.     }
  76. }
  77. void ARF::TxSuccessfulAction()
  78. {
  79.   nSuccess_++;
  80.   nFailed_ = 0;
  81.   justTimedOut = 0;
  82.   justIncr = 0;
  83.       
  84.   if(nSuccess_ == numSuccToIncrRate_)
  85.     {   
  86.       if(incrMode() == 0)
  87. {
  88.   resched(timeout_);
  89.   justIncr = 1;
  90. }
  91.       nSuccess_ = 0;
  92.     }
  93. }
  94. void ARF::TxFailedAction()
  95. {
  96.   nFailed_++;
  97.   nSuccess_ = 0;
  98.   if ((justIncr && (nFailed_ >= numFailToDecrRateAfterIncr_))
  99.       || (justTimedOut && (nFailed_ >= numFailToDecrRateAfterTout_))
  100.       || (nFailed_ >= numFailToDecrRate_))
  101.     {   
  102.       if (decrMode() == 0)
  103. {
  104.   resched(timeout_);
  105. }
  106.       nFailed_ = 0;
  107.       justTimedOut = 0;
  108.       justIncr = 0;
  109.     }
  110. }
  111. void ARF::expire(Event *e)
  112. {
  113.   nFailed_ = 0;
  114.   justIncr = 0;
  115.   if(incrMode())
  116.     {
  117.       justIncr = 1;
  118.       resched(timeout_);
  119.     }
  120.   nSuccess_ = 0;
  121. void ARF::chBusy(double)
  122. {
  123. }