mac-timers.cc
上传用户:sdhqmy
上传日期:2015-12-07
资源大小:63k
文件大小:9k
源码类别:

3G开发

开发平台:

C/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. #include <delay.h>
  36. #include <connector.h>
  37. #include <packet.h>
  38. #include <random.h>
  39.  
  40. // #define DEBUG
  41. //#include <debug.h>
  42. #include <arp.h>
  43. #include <ll.h>
  44. #include <mac.h>
  45. #include <mac-timers.h>
  46. #include <mac-802_11.h> 
  47. /*
  48.  * Force timers to expire on slottime boundries.
  49.  */
  50. // #define USE_SLOT_TIME
  51. #define ROUND_TIME()
  52. {
  53. assert(slottime);
  54. double rmd = remainder(s.clock() + rtime, slottime);
  55. if(rmd > 0.0)
  56. rtime += (slottime - rmd);
  57. else
  58. rtime += (-rmd);
  59. }
  60. /* ======================================================================
  61.    Timers
  62.    ====================================================================== */
  63. void
  64. MacTimer::start(double time)
  65. {
  66. Scheduler &s = Scheduler::instance();
  67. assert(busy_ == 0);
  68. busy_ = 1;
  69. paused_ = 0;
  70. stime = s.clock();
  71. rtime = time;
  72. assert(rtime >= 0.0);
  73. s.schedule(this, &intr, rtime);
  74. }
  75. void
  76. MacTimer::stop(void)
  77. {
  78. Scheduler &s = Scheduler::instance();
  79. assert(busy_);
  80. if(paused_ == 0)
  81. s.cancel(&intr);
  82. busy_ = 0;
  83. paused_ = 0;
  84. stime = 0.0;
  85. rtime = 0.0;
  86. }
  87. /* ======================================================================
  88.    Defer Timer
  89.    ====================================================================== */
  90. void
  91. DeferTimer::start(double time)
  92. {
  93. Scheduler &s = Scheduler::instance();
  94. assert(busy_ == 0);
  95. busy_ = 1;
  96. paused_ = 0;
  97. stime = s.clock();
  98. rtime = time;
  99. #ifdef USE_SLOT_TIME
  100. ROUND_TIME();
  101. #endif
  102. assert(rtime >= 0.0);
  103. s.schedule(this, &intr, rtime);
  104. }
  105. void    
  106. DeferTimer::handle(Event *)
  107. {       
  108. busy_ = 0;
  109. paused_ = 0;
  110. stime = 0.0;
  111. rtime = 0.0;
  112. mac->deferHandler();
  113. }
  114. /* ======================================================================
  115.    NAV Timer
  116.    ====================================================================== */
  117. void    
  118. NavTimer::handle(Event *)
  119. {       
  120. busy_ = 0;
  121. paused_ = 0;
  122. stime = 0.0;
  123. rtime = 0.0;
  124. mac->navHandler();
  125. }
  126. //JUNGMIN
  127. /* ======================================================================
  128.    Wait Timer
  129.    ====================================================================== */
  130. void    
  131. WaitTimer::handle(Event *)
  132. {       
  133. busy_ = 0;
  134. paused_ = 0;
  135. stime = 0.0;
  136. rtime = 0.0;
  137. mac->waitHandler();
  138. }
  139. /* ======================================================================
  140.    Channel Usage Timer
  141.    ====================================================================== */
  142. void    
  143. ChannelUsageTimer::handle(Event *)
  144. {       
  145. busy_ = 0;
  146. paused_ = 0;
  147. stime = 0.0;
  148. rtime = 0.0;
  149. mac->channelusageHandler(mychannel);
  150. }
  151. void
  152. ChannelUsageTimer::AssignChannel(int ch)
  153. {
  154. mychannel = ch;
  155. }
  156. /* ======================================================================
  157.    ATIM Window Timer
  158.    ====================================================================== */
  159. void
  160. ATIMWindowTimer::start(double time)
  161. {
  162. Scheduler &s = Scheduler::instance();
  163. assert(busy_ == 0);
  164. busy_ = 1;
  165. paused_ = 0;
  166. stime = s.clock();
  167. rtime = time;
  168. assert(rtime >= 0.0);
  169. s.schedule(this, &intr, rtime);
  170. }
  171. void    
  172. ATIMWindowTimer::handle(Event *)
  173. {       
  174. busy_ = 0;
  175. paused_ = 0;
  176. stime = 0.0;
  177. rtime = 0.0;
  178. mac->atimHandler();
  179. }
  180. //end of JUNGMIN
  181. /* ======================================================================
  182.    Receive Timer
  183.    ====================================================================== */
  184. void    
  185. RxTimer::handle(Event *)
  186. {       
  187. busy_ = 0;
  188. paused_ = 0;
  189. stime = 0.0;
  190. rtime = 0.0;
  191. mac->recvHandler();
  192. }
  193. //JUNGMIN
  194. /* ======================================================================
  195.    Receive Data Timer
  196.    ====================================================================== */
  197. void    
  198. RxDATATimer::handle(Event *)
  199. {       
  200. busy_ = 0;
  201. paused_ = 0;
  202. stime = 0.0;
  203. rtime = 0.0;
  204. mac->recvDATAHandler();
  205. }
  206. /* ======================================================================
  207.    Send Timer
  208.    ====================================================================== */
  209. void    
  210. TxTimer::handle(Event *)
  211. {       
  212. busy_ = 0;
  213. paused_ = 0;
  214. stime = 0.0;
  215. rtime = 0.0;
  216. mac->sendHandler();
  217. }
  218. //end of JUNGMIN
  219. /* ======================================================================
  220.    Interface Timer
  221.    ====================================================================== */
  222. void
  223. IFTimer::handle(Event *)
  224. {
  225. busy_ = 0;
  226. paused_ = 0;
  227. stime = 0.0;
  228. rtime = 0.0;
  229. mac->txHandler();
  230. }
  231. /* ======================================================================
  232.    Backoff Timer
  233.    ====================================================================== */
  234. void
  235. BackoffTimer::handle(Event *)
  236. {
  237. busy_ = 0;
  238. paused_ = 0;
  239. stime = 0.0;
  240. rtime = 0.0;
  241. difs_wait = 0.0;
  242. mac->backoffHandler();
  243. }
  244. void
  245. BackoffTimer::start(int cw, int idle)
  246. {
  247. Scheduler &s = Scheduler::instance();
  248. assert(busy_ == 0);
  249. busy_ = 1;
  250. paused_ = 0;
  251. stime = s.clock();
  252. rtime = (Random::random() % cw) * mac->phymib_->SlotTime;
  253. #ifdef USE_SLOT_TIME
  254. ROUND_TIME();
  255. #endif
  256. difs_wait = 0.0;
  257. if(idle == 0)
  258. paused_ = 1;
  259. else {
  260. assert(rtime >= 0.0);
  261. s.schedule(this, &intr, rtime);
  262. }
  263. }
  264. void
  265. BackoffTimer::pause()
  266. {
  267. Scheduler &s = Scheduler::instance();
  268. //the caculation below make validation pass for linux though it
  269. // looks dummy
  270. double st = s.clock();
  271. double rt = stime + difs_wait;
  272. double sr = st - rt;
  273.         double mst = (mac->phymib_->SlotTime);
  274.         int slots = int (sr/mst);
  275.     //int slots = (int) ((s.clock() - (stime + difs_wait)) / mac->phymib_->SlotTime);
  276. if(slots < 0)
  277. slots = 0;
  278. assert(busy_ && ! paused_);
  279. paused_ = 1;
  280. rtime -= (slots * mac->phymib_->SlotTime);
  281. assert(rtime >= 0.0);
  282. difs_wait = 0.0;
  283. s.cancel(&intr);
  284. }
  285. void
  286. BackoffTimer::resume(double difs)
  287. {
  288. Scheduler &s = Scheduler::instance();
  289. assert(busy_ && paused_);
  290. paused_ = 0;
  291. stime = s.clock();
  292. /*
  293.  * The media should be idle for DIFS time before we start
  294.  * decrementing the counter, so I add difs time in here.
  295.  */
  296. difs_wait = difs;
  297. /*
  298. #ifdef USE_SLOT_TIME
  299. ROUND_TIME();
  300. #endif
  301. */
  302. assert(rtime + difs_wait >= 0.0);
  303.         s.schedule(this, &intr, rtime + difs_wait);
  304. }
  305. //JUNGMIN
  306. /* ======================================================================
  307.    Beacon Timer
  308.    ====================================================================== */
  309. void
  310. BeaconTimer::handle(Event *)
  311. {
  312. busy_ = 0;
  313. paused_ = 0;
  314. stime = 0.0;
  315. rtime = 0.0;
  316. mac->beaconHandler();
  317. }
  318. /* ======================================================================
  319.    Beacon Backoff Timer
  320.    ====================================================================== */
  321. void
  322. BeaconBackoffTimer::start(int bcw)
  323. {
  324. Scheduler &s = Scheduler::instance();
  325. assert(busy_ == 0);
  326. busy_ = 1;
  327. paused_ = 0;
  328. stime = s.clock();
  329. rtime = (Random::random() % bcw) * mac->phymib_->SlotTime;
  330. #ifdef USE_SLOT_TIME
  331. ROUND_TIME();
  332. #endif
  333. assert(rtime >= 0.0);
  334. s.schedule(this, &intr, rtime);
  335. }
  336. void
  337. BeaconBackoffTimer::handle(Event *)
  338. {
  339. busy_ = 0;
  340. paused_ = 0;
  341. stime = 0.0;
  342. rtime = 0.0;
  343. mac->beaconBackoffHandler();
  344. }
  345. //end of JUNGMIN