mac-timersmr.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) 1997 Regents of the University of California.
  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 the Computer Systems
  17.  * Engineering Group at Lawrence Berkeley Laboratory.
  18.  * 4. Neither the name of the University nor of the Laboratory may be used
  19.  *    to endorse or promote products derived from this software without
  20.  *    specific prior written permission.
  21.  *
  22.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  23.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  24.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  25.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  26.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  27.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  28.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  29.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  30.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  31.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  32.  * SUCH DAMAGE.
  33.  *
  34.  * Ported from CMU/Monarch's code, nov'98 -Padma.
  35.  * Contributions by:
  36.  *   - Mike Holland
  37.  *
  38.  * Ported 2006 from ns-2.29 
  39.  * by Federico Maguolo, Nicola Baldo and Simone Merlin 
  40.  * (SIGNET lab, University of Padova, Department of Information Engineering)
  41.  *
  42.  */
  43. #include <delay.h>
  44. #include <connector.h>
  45. #include <packet.h>
  46. #include <random.h>
  47.  
  48. // #define DEBUG
  49. //#include <debug.h>
  50. #include <arp.h>
  51. #include <ll.h>
  52. #include <mac.h>
  53. #include "mac-timersmr.h"
  54. #include "mac-802_11mr.h"
  55. /*
  56.  * Force timers to expire on slottime boundries.
  57.  */
  58. // #define USE_SLOT_TIME
  59. // change wrt Mike's code
  60.  #ifdef USE_SLOT_TIME
  61.  #error "Incorrect slot time implementation - don't use USE_SLOT_TIME..."
  62.  #endif
  63. #define ROUND_TIME()
  64. {
  65. assert(slottime);
  66. double rmd = remainder(s.clock() + rtime, slottime);
  67. if(rmd > 0.0)
  68. rtime += (slottime - rmd);
  69. else
  70. rtime += (-rmd);
  71. }
  72. /* ======================================================================
  73.    Timers
  74.    ====================================================================== */
  75. void
  76. Mr_MacTimer::start(double time)
  77. {
  78. Scheduler &s = Scheduler::instance();
  79. assert(busy_ == 0);
  80. busy_ = 1;
  81. paused_ = 0;
  82. stime = s.clock();
  83. rtime = time;
  84. assert(rtime >= 0.0);
  85. s.schedule(this, &intr, rtime);
  86. }
  87. void
  88. Mr_MacTimer::stop(void)
  89. {
  90. Scheduler &s = Scheduler::instance();
  91. assert(busy_);
  92. if(paused_ == 0)
  93. s.cancel(&intr);
  94. busy_ = 0;
  95. paused_ = 0;
  96. stime = 0.0;
  97. rtime = 0.0;
  98. }
  99. /* ======================================================================
  100.    Defer Timer
  101.    ====================================================================== */
  102. void
  103. Mr_DeferTimer::start(double time)
  104. {
  105. Scheduler &s = Scheduler::instance();
  106. assert(busy_ == 0);
  107. busy_ = 1;
  108. paused_ = 0;
  109. stime = s.clock();
  110. rtime = time;
  111. #ifdef USE_SLOT_TIME
  112. ROUND_TIME();
  113. #endif
  114. assert(rtime >= 0.0);
  115. s.schedule(this, &intr, rtime);
  116. }
  117. void    
  118. Mr_DeferTimer::handle(Event *)
  119. {       
  120. busy_ = 0;
  121. paused_ = 0;
  122. stime = 0.0;
  123. rtime = 0.0;
  124. mac->deferHandler();
  125. }
  126. /* ======================================================================
  127.    NAV Timer
  128.    ====================================================================== */
  129. void    
  130. Mr_NavTimer::handle(Event *)
  131. {       
  132. busy_ = 0;
  133. paused_ = 0;
  134. stime = 0.0;
  135. rtime = 0.0;
  136. mac->navHandler();
  137. }
  138. /* ======================================================================
  139.    Receive Timer
  140.    ====================================================================== */
  141. void    
  142. Mr_RxTimer::handle(Event *)
  143. {       
  144. busy_ = 0;
  145. paused_ = 0;
  146. stime = 0.0;
  147. rtime = 0.0;
  148. mac->recvHandler();
  149. }
  150. /* ======================================================================
  151.    Send Timer
  152.    ====================================================================== */
  153. void    
  154. Mr_TxTimer::handle(Event *)
  155. {       
  156. busy_ = 0;
  157. paused_ = 0;
  158. stime = 0.0;
  159. rtime = 0.0;
  160. mac->sendHandler();
  161. }
  162. /* ======================================================================
  163.    Interface Timer
  164.    ====================================================================== */
  165. void
  166. Mr_IFTimer::handle(Event *)
  167. {
  168. busy_ = 0;
  169. paused_ = 0;
  170. stime = 0.0;
  171. rtime = 0.0;
  172. mac->txHandler();
  173. }
  174. /* ======================================================================
  175.    Backoff Timer
  176.    ====================================================================== */
  177. void
  178. Mr_BackoffTimer::handle(Event *)
  179. {
  180. busy_ = 0;
  181. paused_ = 0;
  182. stime = 0.0;
  183. rtime = 0.0;
  184. difs_wait = 0.0;
  185. mac->backoffHandler();
  186. }
  187. void
  188. Mr_BackoffTimer::start(int cw, int idle, double difs)
  189. {
  190. Scheduler &s = Scheduler::instance();
  191. assert(busy_ == 0);
  192. busy_ = 1;
  193. paused_ = 0;
  194. stime = s.clock();
  195. rtime = (Random::random() % cw) * mac->phymib_.getSlotTime();
  196. #ifdef USE_SLOT_TIME
  197. ROUND_TIME();
  198. #endif
  199. difs_wait = difs;
  200. if(idle == 0)
  201. paused_ = 1;
  202. else {
  203. //assert(rtime + difs_wait >= 0.0);
  204. //s.schedule(this, &intr, rtime + difs_wait);
  205. assert(difs_wait >= 0.0);
  206. s.schedule(this, &intr, difs_wait);
  207. }
  208. }
  209. void
  210. Mr_BackoffTimer::pause()
  211. {
  212. Scheduler &s = Scheduler::instance();
  213. //the caculation below make validation pass for linux though it
  214. // looks dummy
  215. double st = s.clock();
  216. double rt = stime + difs_wait;
  217. double sr = st - rt;
  218. double mst = (mac->phymib_.getSlotTime());
  219.         int slots = int (sr/mst);
  220. if(slots < 0)
  221. slots = 0;
  222. assert(busy_ && ! paused_);
  223. paused_ = 1;
  224. rtime -= (slots * mac->phymib_.getSlotTime());
  225. assert(rtime >= 0.0);
  226. difs_wait = 0.0;
  227. s.cancel(&intr);
  228. }
  229. void
  230. Mr_BackoffTimer::resume(double difs)
  231. {
  232. Scheduler &s = Scheduler::instance();
  233. assert(busy_ && paused_);
  234. paused_ = 0;
  235. stime = s.clock();
  236. /*
  237.  * The media should be idle for DIFS time before we start
  238.  * decrementing the counter, so I add difs time in here.
  239.  */
  240. difs_wait = difs;
  241. /*
  242. #ifdef USE_SLOT_TIME
  243. ROUND_TIME();
  244. #endif
  245. */
  246. assert(rtime + difs_wait >= 0.0);
  247.         s.schedule(this, &intr, rtime + difs_wait);
  248. }