contentionrequest.cc
上传用户:hzie11
上传日期:2013-10-07
资源大小:1487k
文件大小:6k
源码类别:

网络

开发平台:

C/C++

  1. /* This software was developed at the National Institute of Standards and
  2.  * Technology by employees of the Federal Government in the course of
  3.  * their official duties. Pursuant to title 17 Section 105 of the United
  4.  * States Code this software is not subject to copyright protection and
  5.  * is in the public domain.
  6.  * NIST assumes no responsibility whatsoever for its use by other parties,
  7.  * and makes no guarantees, expressed or implied, about its quality,
  8.  * reliability, or any other characteristic.
  9.  * <BR>
  10.  * We would appreciate acknowledgement if the software is used.
  11.  * <BR>
  12.  * NIST ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION AND
  13.  * DISCLAIM ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING
  14.  * FROM THE USE OF THIS SOFTWARE.
  15.  * </PRE></P>
  16.  * @author  rouil
  17.  */
  18. #include "contentionrequest.h"
  19. #include "contentionslot.h"
  20. #include "framemap.h"
  21. #include "wimaxscheduler.h"
  22. #include "random.h"
  23. /*
  24.  * Handling function for WimaxFrameTimer
  25.  * @param e The event that occured
  26.  */
  27. void WimaxBackoffTimer::handle(Event *e)
  28. {
  29.   busy_ = 0;
  30.   paused_ = 0;
  31.   stime = 0.0;
  32.   rtime = 0.0;
  33.   mac->transmit (c_->p_->copy());
  34.   //start timeout trigger
  35.   c_->starttimeout ();
  36. }
  37. void WimaxBackoffTimer::pause()
  38. {
  39. Scheduler &s = Scheduler::instance();
  40. //the caculation below make validation pass for linux though it
  41. // looks dummy
  42. double st = s.clock();
  43. double rt = stime;
  44. double sr = st - rt;
  45. assert(busy_ && ! paused_);
  46. paused_ = 1;
  47. rtime -= sr;
  48. assert(rtime >= 0.0);
  49. s.cancel(&intr);
  50. }
  51. void WimaxBackoffTimer::resume()
  52. {
  53. Scheduler &s = Scheduler::instance();
  54. assert(busy_ && paused_);
  55. paused_ = 0;
  56. stime = s.clock();
  57. assert(rtime >= 0.0);
  58.         s.schedule(this, &intr, rtime);
  59. }
  60. /*
  61.  * Creates a contention slot for the given frame
  62.  * @param s The contention slot 
  63.  * @param p The packet to send
  64.  */
  65. ContentionRequest::ContentionRequest (ContentionSlot *s, Packet *p)
  66. {
  67.   assert (s);
  68.   assert (p);
  69.   s_=s;
  70.   mac_ = s_->map_->getMac();
  71.   window_ = s_->getBackoff_start();
  72.   nb_retry_ = 0;
  73.   p_=p;
  74.   backoff_timer_ = new WimaxBackoffTimer (this, mac_);
  75.   timeout_timer_ = new ContentionTimer (this);
  76.   int result = Random::random() % ((int)(pow (2, window_)+1));
  77.   mac_->debug ("At %f in Mac %d Start contention in %f(backoff=%d, size=%d, ps=%f)n", NOW, mac_->addr(), result*s_->getSize()*mac_->getPhy()->getPS(),result,s_->getSize(),mac_->getPhy()->getPS());
  78.   backoff_timer_->start (result*s_->getSize()*mac_->getPhy()->getPS());
  79.   backoff_timer_->pause();
  80. }
  81. ContentionRequest::~ContentionRequest ()
  82. {
  83.   //printf ("canceling timeoutn");
  84.   //the timeout timer need not be triggered 
  85.   //this can happen when the STA received bw allocation
  86.   //when it is not waiting for one (or it's still in backoff)
  87.   if (timeout_timer_->status()!=TIMER_IDLE)
  88.     timeout_timer_->cancel();
  89.   if (backoff_timer_->busy())
  90.     backoff_timer_->stop();
  91.   delete backoff_timer_;
  92.   delete timeout_timer_;
  93.   assert (p_);
  94.   Packet:: free (p_);
  95. }
  96. /*
  97.  * Called when timeout expired
  98.  */
  99. void ContentionRequest::expire ()
  100. {
  101. }
  102. /*
  103.  * Called when timeout expired
  104.  */
  105. void ContentionRequest::starttimeout ()
  106. {
  107.   timeout_timer_->sched (timeout_);
  108. }
  109. /* 
  110.  * Pause the backoff timer
  111.  */
  112. void ContentionRequest::pause () 
  113. {
  114.   if (backoff_timer_->busy() && !backoff_timer_->paused())
  115.     backoff_timer_->pause(); 
  116. }
  117. /*
  118.  * Resume the backoff timer
  119.  */
  120. void ContentionRequest::resume () 
  121.   if (backoff_timer_->paused() && timeout_timer_->status()==TIMER_IDLE)
  122.     backoff_timer_->resume(); 
  123. }
  124. /*
  125.  * Creates a contention slot for the given frame
  126.  * @param frame The frame map 
  127.  */
  128. RangingRequest::RangingRequest (ContentionSlot *s, Packet *p) : ContentionRequest (s,p)
  129. {
  130.   type_ = WimaxT3TimerID;
  131.   timeout_ = mac_->macmib_.t3_timeout;
  132. }
  133. /*
  134.  * Called when timeout expired
  135.  */
  136. void RangingRequest::expire ()
  137. {
  138.   mac_->debug ("Ranging request expiresn");
  139.   if (nb_retry_ == (int)mac_->macmib_.contention_rng_retry) {
  140.     //max retries reached, inform the scheduler
  141.     mac_->getScheduler ()->expire (type_);
  142.   } else {
  143.     if (window_ < s_->getBackoff_stop())
  144.       window_++;
  145.     nb_retry_++;
  146.     int result = Random::random() % ((int)(pow (2, window_)+1));
  147.     mac_->debug ("Start Ranging contention in %f(backoff=%d, size=%d, ps=%f)n", result*s_->getSize()*mac_->getPhy()->getPS(),result,s_->getSize(),mac_->getPhy()->getPS());
  148.     backoff_timer_->start (result*s_->getSize()*mac_->getPhy()->getPS());
  149.     backoff_timer_->pause();
  150.   }
  151. }
  152. /*
  153.  * Creates a contention slot for the given frame
  154.  * @param frame The frame map 
  155.  */
  156. BwRequest::BwRequest (ContentionSlot *s, Packet *p, int cid, int len) : ContentionRequest (s,p)
  157. {
  158.   type_ = WimaxT16TimerID;
  159.   timeout_ = mac_->macmib_.t16_timeout;
  160.   cid_ = cid;
  161.   size_ = len;
  162. }
  163. /*
  164.  * Called when timeout expired
  165.  */ 
  166. void BwRequest::expire ()
  167. {
  168.   printf ("Bw request expiresn");
  169.   if (nb_retry_ == (int)mac_->macmib_.request_retry) {
  170.     //max retries reached, delete the pdu that were waiting
  171.     Connection *c = mac_->getCManager()->get_connection (cid_, true);
  172.     int len = 0;
  173.     printf ("Dropping packet because bw req exceededn");
  174.     while (len < size_) {
  175.       Packet *p = c->dequeue();
  176.       assert (p);
  177.       len += HDR_CMN(p)->size();
  178.       Packet::free (p);
  179.     }
  180.   } else {
  181.     if (window_ < s_->getBackoff_stop())
  182.       window_++;
  183.     nb_retry_++;
  184.     int result = Random::random() % ((int)(pow (2, window_)+1));
  185.     printf ("Start BW contention in %f(backoff=%d, size=%d, ps=%f)n", result*s_->getSize()*mac_->getPhy()->getPS(),result,s_->getSize(),mac_->getPhy()->getPS());
  186.     backoff_timer_->start (result*s_->getSize()*mac_->getPhy()->getPS());
  187.     backoff_timer_->pause();
  188.   }
  189. }