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

网络

开发平台:

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 "contentionslot.h"
  19. #include <random.h>
  20. #include <math.h>
  21. /*
  22.  * Creates a contention slot for the given frame
  23.  * @param frame The frame map 
  24.  */
  25. ContentionSlot::ContentionSlot (FrameMap *map) 
  26. {
  27.   assert (map);
  28.   map_ = map;
  29. }
  30. /**
  31.  * Destructor
  32.  */
  33. ContentionSlot::~ContentionSlot() {}
  34. /*
  35.  * Set the initial contention slot window size
  36.  * @param backoff_start the initial contention slot window size
  37.  */
  38. void ContentionSlot::setBackoff_start( int backoff_start ) 
  39.   backoff_start_ = backoff_start;
  40. }
  41. /*
  42.  * Set the final contention slot window size
  43.  * @param backoff_stop the final contention slot window size 
  44.  */
  45. void ContentionSlot::setBackoff_stop( int backoff_stop ) 
  46.   backoff_stop_ = backoff_stop;
  47. }
  48. /**
  49.  * Resume the timers for the requests
  50.  */
  51. void ContentionSlot::resumeTimers () {}
  52. /**
  53.  * Pause the timers for the requests
  54.  */
  55. void ContentionSlot::pauseTimers () {}
  56. /**** Methods for Ranging Contention slot ****/
  57. /*
  58.  * Creates a contention slot for the given frame
  59.  * @param frame The frame map 
  60.  */
  61. RngContentionSlot::RngContentionSlot (FrameMap *map) : ContentionSlot (map)
  62. {
  63.   request_ = NULL;
  64. }
  65. /**
  66.  * Destructor
  67.  */
  68. RngContentionSlot::~RngContentionSlot() 
  69. {
  70.   if (request_)
  71.     delete request_;
  72. }
  73. /*
  74.  * Add a ranging request
  75.  * @param p The packet to be sent during the ranging opportunity
  76.  */
  77. void RngContentionSlot::addRequest (Packet *p)
  78. {
  79.   assert (request_ == NULL);
  80.   request_ = new RangingRequest (this, p);
  81. }
  82. /*
  83.  * Remove the pending request
  84.  */
  85. void RngContentionSlot::removeRequest ()
  86. {
  87.   //assert (request_);
  88.   if (request_) {
  89.     delete request_;
  90.     request_ = NULL;
  91.   }
  92. }
  93. /**
  94.  * Resume the timers for the requests
  95.  */
  96. void RngContentionSlot::resumeTimers ()
  97. {
  98.   if (request_)
  99.     request_->resume();
  100. }
  101. /**
  102.  * Pause the timers for the requests
  103.  */
  104. void RngContentionSlot::pauseTimers ()
  105. {
  106.   if (request_)
  107.     request_->pause();
  108. }
  109. /**** Methods for Bandwidth Contention slot ****/
  110. /*
  111.  * Creates a contention slot for the given frame
  112.  * @param frame The frame map 
  113.  */
  114. BwContentionSlot::BwContentionSlot (FrameMap *map) : ContentionSlot (map)
  115. {
  116.   LIST_INIT (&request_list_);
  117. }
  118. /**
  119.  * Destructor
  120.  */
  121. BwContentionSlot::~BwContentionSlot() {}
  122. /*
  123.  * Add a bandwidth request
  124.  * @param p The packet to be sent during the ranging opportunity
  125.  * @param cid The CID of the bandwidth request
  126.  * @param len The size in bytes of the bandwidth request
  127.  */
  128. void BwContentionSlot::addRequest (Packet *p, int cid, int len)
  129. {
  130.   assert (getRequest (cid)==NULL);
  131.   BwRequest *b = new BwRequest (this, p, cid, len);
  132.   b->insert_entry_head (&request_list_);
  133. }
  134. /*
  135.  * Remove the pending request
  136.  */
  137. void BwContentionSlot::removeRequest (int cid)
  138. {
  139.   BwRequest *b = getRequest (cid);
  140.   if (b!=NULL) {
  141.     b->remove_entry ();
  142.     delete b;
  143.   }
  144. }
  145. /*
  146.  * Remove all pending reuquest
  147.  */
  148. void BwContentionSlot::removeRequests ()
  149. {
  150.   for (BwRequest *c = (BwRequest *)request_list_.lh_first; c ; c=(BwRequest *)request_list_.lh_first) {
  151.     c->remove_entry();
  152.     delete c;
  153.   }
  154. }
  155. /*
  156.  * Get the request for the given CID
  157.  * @param cid The CID for the request
  158.  */
  159. BwRequest* BwContentionSlot::getRequest (int cid)
  160. {
  161.   for (BwRequest *c = (BwRequest *)request_list_.lh_first; c ; c=(BwRequest *)(c->next_entry())) {
  162.     if (c->getCID()==cid)
  163.       return c;
  164.   }
  165.   return NULL;
  166. }
  167. /**
  168.  * Resume the timers for the requests
  169.  */
  170. void BwContentionSlot::resumeTimers ()
  171. {
  172.   for (BwRequest *c = (BwRequest *)request_list_.lh_first; c ; c=(BwRequest *)(c->next_entry())) {
  173.       c->resume();
  174.   }
  175. }
  176. /**
  177.  * Pause the timers for the requests
  178.  */
  179. void BwContentionSlot::pauseTimers ()
  180. {
  181.   for (BwRequest *c = (BwRequest *)request_list_.lh_first; c ; c=(BwRequest *)(c->next_entry())) {
  182.       c->pause();
  183.   }
  184. }